我正在編寫一個POSIX外殼腳本,它可能會或可能不會從標準輸入接收輸入(如foo.sh < test.txt
,非交互式)。如何檢查stdin上是否有任何內容,以避免在while read -r line...
上停止?檢測外殼腳本中標準輸入內容的存在
回答
如果我有問題的權利,你可以嘗試以下方法:
#!/bin/sh
if [ -t 0 ]; then
echo running interactivelly
else
while read -r line ; do
echo $line
done
fi
只是向上看,這是由於stdin和捕獲stdout時觸發的。 (二者interactivelly運行) ./yourscript <./the_input_your_giving_your_script.txt && ./yourscript> ./what_your_script_outputs。txt – DebugXYZ 2014-06-29 05:23:03
@DeShawnWilliams不,@ dmedvinsky的回答是正確的:如果在終端上打開文件描述符'n','test -tn'爲true,因此'test -t 0'只檢查stdin,'test -t 1 '只檢查標準輸出。 – bootleg 2015-05-22 07:55:09
如果您從不想以交互方式運行腳本,請將輸入文件作爲參數,而不是使用stdin
。某些程序使用標誌或特殊文件名來表示它們應該從標準輸入而不是從文件輸入;該案例可以讓你在必要時處理命令行操作。
如果您希望您的腳本採用標準輸入,爲什麼不想讓它成爲交互式(或至少像其他POSIX工具一樣)?
一種常見的方式來告訴程序從標準輸入讀取的文件是提供'-'而不是文件名。 – Cascabel 2010-03-16 18:07:46
您可以輕鬆實現類似的行爲作爲「貓」的命令,即從提供的文件,或者如果列表請他們'沒有提供,然後從標準輸入讀取。
雖然你可能不使用這種想法,我覺得這篇Linux Journal中會是很有意思的,你http://www.linuxjournal.com/content/determine-if-shell-input-coming-terminal-or-pipe
:-)
爲了從字面上回答這個問題(但不是你真正想要的東西):read -t 0
超時,零秒。
- 這是一種競爭條件,取決於左側何時準備提供數據。您可以指定
-t 5
,但是在抖動系統上即使有問題也是如此。 - 在SUSv3中沒有標準化。它在BSD sh,bash,zsh中。它不在ksh或破折號中。
所以你不能只使用#!/ bin/sh,並期待有這個。
基本的問題是,即使現在沒有任何標準輸入,這並不意味着不會很快。調用一個程序通常會讓stdin連接到終端/無論如何,所以無法告訴需要什麼。
所以,從字面上回答你的問題,你可以做到這一點,但實際上你的選擇是:
- 測試,如果標準輸入是一個tty:
[ -t 0 ]
- 使用argv的控制行爲
我剛剛使用zsh進行了試驗。我注意到'read -t'或等價地'read -t0'具有**非確定性**行爲。所以,如你所說,避免使用它。 – Tarrasch 2013-01-01 18:25:51
但是,這要與答案中使用的_test_「-t」區分開來。 – 2014-11-20 00:21:01
- 1. 外殼腳本輸入目錄
- 2. 使用外殼腳本和標準輸入創建多個帳戶
- 3. UNIX外殼,重定向輸出,但保持在標準輸入
- 4. 檢測外殼腳本中的Windows操作系統版本
- 5. 爲外殼準備一個輸入
- 6. 檢測用戶在文本框中輸入的內容
- 7. 外殼腳本文件測試
- 8. C編寫外殼,關閉標準輸入某處
- 9. 自動ACL檢查外殼腳本
- 10. 接收從輸入時間戳在一個外殼腳本
- 11. 重定向外殼輸出Ruby腳本
- 12. 使用XML獲取外殼腳本的輸入
- 13. 包含星號的外殼腳本輸入
- 14. 傳遞腳本命令/輸入到打開的WinSCP外殼
- 15. 帶外殼腳本的RAILS_ROOT
- 16. 簡單的外殼腳本
- 17. 在C中檢查標準輸入#
- 18. 如何在Iron Python中檢測腳本被調用的內容?
- 19. 製作腳本以便輸入內容
- 20. 檢查文件是否存在與外殼腳本中的通配符
- 21. 殼:標準輸入使用輸入重定向
- 22. 外殼腳本來檢查和插入IP地址
- 23. 殼shell內的shell腳本
- 24. 經由外殼腳本
- 25. 從外殼腳本函數
- 26. (?TCL)腳本從外殼
- 27. 使用外殼腳本
- 28. 外殼腳本解析
- 29. 環路bash外殼腳本
- 30. 分析外殼腳本
標準輸出:http://stackoverflow.com/questions/911168/how-to-detect-if-my-shell-script-is-running-through-a-pipe – 2017-05-11 09:01:10