我想了解為什么echo的行為與echo "Hi"|cat在bash腳本中使用時的行為不同,因為管道斷了
行為 :
echo立即終止腳本 。
echo "Hi"|cat管道終止,但腳本繼續 。
示例再現步驟
script_with_echo.sh :#!/bin/bash
mkfifo ii
cat<ii >/dev/null & echo "KILL : $!"
exec 3>ii
rm ii
while true; do read LINE; echo "$LINE" >&3; echo "$? ">/some/external/file;done
script_with_echo_cat.sh :
#!/bin/bash
mkfifo ii
cat<ii >/dev/null & echo "KILL : $!"
exec 3>ii
rm ii
while true; do read LINE; echo "$LINE"|cat>&3; echo"$? ">/some/external/file;done
- 在終端1上運行一個腳本(注意
KILL : <PID>) - 向終端-1輸入一些示例行,并驗證
0(成功退出代碼)被寫入/some/external/file。
- 從終端2運行
kill -9 <PID>。
- 在終端-1上輸入另一個樣本行 。
-
- 如果
script_with_echo.sh在步驟1中被執行,腳本立即終止(并且沒有錯誤代碼被寫入/some/external/file) - 如果
script_with_echo_cat.sh在步驟1中被執行,腳本繼續正常運行(對于每一個后續的樣本行輸入,錯誤代碼141(SIGPIPE)被寫入/some/external/file,這是預期的) 。
- 如果
為什么會出現這種不同的行為?
uj5u.com熱心網友回復:
為什么在bash腳本中使用echo時,echo的行為與echo "Hi"|cat的行為不同
在
echo >&3的情況下,當連接到第三個檔案描述符的管道被關閉時,bash行程會被SIGPIPE殺死。這主要是因為echo是一個內置的命令--它是由bash本身執行的,不需要任何fork()ing。在
echo | cat >&3的情況下,當連接到第3個檔案描述符的管道被關閉時,那么子行程cat被SIGPIPE殺死,在這種情況下,父行程繼續存在,所以Bash可以處理退出狀態。比較
strace -ff bash -c 'mkfifo ii; cat <ii >/dev/null & pid=$! ; exec 3>ii ; kill $pid ; rm ii ; echo something >&3'vs....; /bin/echo something > &3'.轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/308105.html
標籤:
