2011-06-30 82 views
7

當我有sh:我如何避免破壞編號的文件描述符?

exec 3>>file    # file descriptor 3 now points to file 
    [ $dryrun ] && exec 3>&1 # or possibly to stdout 
    echo "running">&3 
    exec 3>&-     # and is now closed 

我擔心可能已經指出了問題的功能之外什麼文件描述符3。我該如何處理?

  • 有沒有內建的next_available_fd
  • 有沒有辦法將fd3複製到變量中,然後在函數完成後將其複製回來?
    • 在這種情況下,我應該擔心線程和併發寫入fd3嗎?
  • 我在噓,但也許bash/ksh/zsh有一個答案呢?

回答

1

而不是使用exec來重定向功能中的文件描述符,你可以(在bash,我還沒有與其他炮彈試過)做的事:

 
foo() { 
    test $dryrun && exec 3>&1 
    echo running >&3 
} 3>>file 

foo 
more_commands 

在此設置中,「運行」,將去根據$ dryrun將其轉換爲文件或原始stdout,more_commands將具有fd 3,這與調用foo之前相同。

1

我不知道任何事情一樣簡單next_available_fd,但(在不影響它的功能外臨時重定向文件描述符),以獲得您想要的功能,可以爲在bash(我不如下實現知道有關SH):

exec 3>file3 
exec 1>file1 

echo "something">&3 
echo "something else" 

f31() { 
     echo "something">&3 
} 
f31 3>&1 

f13() { 
     echo "something else" 
} 
f13 >&3 

echo "something">&3 
echo "something else" 

產生的file1

something else 
something 
something else 

而且file3

something 
something else 
something 

這表明重定向被限制在每一種情況下的函數調用。

+0

對不起,您示例代碼的哪一部分演示了什麼? – nodakai

0

如果您的系統使用的文件系統/proc,看看裏面/proc/$$/fd看看有什麼使用。