2015-10-08 43 views
5

叫我有一個命令我會運行到生成隨機字符串:管道頭在水管壞了導致shell腳本從蟒蛇

var=`< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c8` 

當我在交互bash命令這個命令我得到絕對沒有錯誤。但是當我把這個命令放到腳本中,並將其作爲腳本運行時,我得到由tr指示的Broken pipe錯誤。我已經閱讀了幾個相關的主題,但仍然沒有答案,爲什麼腳本和交互行爲是不同的,有沒有辦法用shell選項或其他的控制它?

編輯我:

在問候給我發現表明破裂的管道失誤可以通過控制註釋:

trap - SIGPIPE # to ignore errors 

trap "" SIGPIPE # to display errors 

編輯II:

好吧,我提供了關於繁殖條件的錯誤信息。最後,它似乎)引起的與Python包裝,與使用os.system(稱爲腳本問題:給定

python -c "import os; os.system('sh -c \"< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c8\"')" 

線獨立使用OS的產生破裂的管道失誤。

編輯III:

這個主題已經在這裏討論: https://mail.python.org/pipermail/python-dev/2005-September/056341.html

+1

聽起來像所討論的問題[這裏](https://github.com/koalaman/shellcheck/issues/494)和在參考的問題。 (shellcheck沒有涉及到,它只是恰好討論了這個確切的問題,並討論了關於使用shellcheck,這是一個很棒的工具,警告這類事情。) –

+0

在Cygwin/bash-4.1.10下完美工作(4)...(在腳本中設置你的行加一個'echo $ var',除'#!/ bin/sh'之外別無他法。) – Amessihel

+1

你是否在腳本中捕獲SIGPIPE? – PSkocik

回答

3

如果父進程的一個陷阱sigpipe,則該管道將繼承ignore信號配置,這將導致此問題你正在經歷。

這可能是(安全)轉載使用:

(trap '' pipe; var=`< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c8) 

通常情況下,head -c8命令將完成很快此時其stdin關閉。由於它是stdin是連接到stdouttr的管道,因此tr現在不再有意義寫入其stdout。一旦嘗試,系統將用SIGPIPE殺死它。 除非tr忽略此信號,或者繼承了其父母對此信號的處置ignoreSIG_IGN)。然後writetr的破損stdout將只會導致常規錯誤,並將errno設置爲EPIPE,此時tr很可能會產生串並將此錯誤輸出到stderr並退出。