我終於遇到了令人驚訝的標準輸入法行爲,當管道進入一段時間閱讀循環。bash while read loop和stdin - 強制嵌套命令的stdin to tty?
考慮以下幾點:
find . | while read file;
do
echo "==[$file]==";
cat;
done
在這種情況下,cat
只是一個替身,從標準輸入接收輸入的任何命令。令人驚訝的是(至少對我來說)cat
的STDIN實際上是來自find
,所以它吞噬了其餘的find
輸出。
假設你想直接從tty與cat
的地方進行交互。例如。假設您想運行一個腳本,而不是cat
,該腳本可能會提出您想要以交互方式回覆的問題("<file> exists: Overwrite? [y/n]"
)。
有沒有辦法強制內部命令的STDIN是tty?
我發現了很多類似的問題,這包括:Why redirect stdin inside a while read loop in bash?
但我不明白的回答不夠好,得到它的工作。
(編輯:在澄清對其他問題的光,我現在正在考慮這個這個問題的一個副本。)
哪一部分,特別是* *,是很難理解嗎? (我實際上只是修改了代碼,以便在不到一小時前添加一些評論;希望自己能夠滿足)。 –
......雖然 - 後續描述如何確切的其他答案沒有解決您的問題將不勝感激。 (一種可能性是我們會在這裏創建一個明顯不同的新問題 - 但另一個可能是提高原有的足以使其更有用的另一個問題也增加了網站的價值)。 –
這簡直就是你的bash比我的強得多。 我看了你的答案你添加的代碼註釋之前。這讓我明白了'cat'的stdin從'find'中吞噬了一切,我沒有理解。我投了票,這可能會引發你添加評論。 我做'2>&1'之前大致瞭解,但這個東西是所有外國對我說:'EXEC 3 <的/ dev/tty的|| exec 3 <&0; exec 3 <& - '。我嘗試添加這些東西給我,但它不適用於我(因爲我遺漏了「&」)。 評論幫助我更好地理解它。 – adfaklsdjf