2014-02-13 53 views
0
#!/bin/sh 
# Tcl ignores the next line -*- tcl -*- \ 
exec wish "$0" -- "[email protected]" 

exec -ignorestderr -- {*}$argv >@stdout 2>@stderr 

exit 

_傳收標準文件描述符子進程

$ wish test.sh -- sh -c date 2>&1 | cat 
Thu Feb 13 23:08:09  2014 

如果我不用管stdout或stderr,我得到:channel wasn't opened for writing。但是如果它關閉了,我希望tcl將關閉的文件描述符傳遞給子進程。我不希望tcl捕獲命令的輸出。

回答

-1

我多次閱讀您的問題,但仍未能理解您嘗試做什麼。但是,你的腳本看起來太複雜了。如果你想要做的就是捕捉date命令的輸出:

set output [exec date] 
puts $output; # Delete this line if you don't want any output. 

只是打電話date是不夠的,你沒有做到這一點:

sh -c date 2>&1 | cat 

我知道這可能不是成爲你正在尋找的答案。如果您仍然需要幫助,請在您的問題中進一步解釋。

+0

我看你不知道什麼是關閉fd是 – basin

0

請勿在的同一時間使用stderr的重定向。該選項通過使用重定向在內部工作(進入一個簡單的管道),所以當你混合這兩件事情時,它們會爭奪子進程的真實標準錯誤通道的配置。你不想那樣。

在您的具體情況下,由於您希望stderr通過連接,只需省略-ignorestderr選項。

exec -- {*}$argv >@stdout 2>@stderr 

注意,這是從一個封閉stderr工作不同!這會導致各種事情崩潰;幾乎所有你遇到的Unix進程都假定它是開放的,並且可以寫入它。

+0

重定向到'/ dev/null'比關閉好得多...... –

+0

他們認爲它是開放的,他們不檢查write()的結果,所以當它關閉時,它們不會死亡 – basin

+0

感謝您提供有關'-ignorestderr'' – basin