Bash
儘管不使用換行符,但在管道期間如何終止輸入?
當我給出這個命令時:
$echo -n “你好”
你好$
我得到上面的輸出。這意味著 echo -n 列印沒有終止換行符的字元串。
現在,我將輸出通過管道傳輸到讀取,讀取命令應該繼續讀取,直到遇到換行符。
$echo -n “你好” | 讀
$
在上面的命令中,返回命令提示符。但是,我希望上述命令會掛起,因為讀取會不斷等待輸入,因為它沒有遇到換行符。為什麼這不會發生?
如果您調查該管道的退出狀態,您會注意到
read
返回 1:$ echo -n "Hello" | read $ echo $? 1
它返回 1,因為它遇到了文件結束條件,因此無法讀取更多數據。來自的輸入流
echo
已關閉,因為echo
已完成其任務並終止,關閉管道的那一側。在輸入流關閉之前讀取的數據仍然在變數
echo
中可用:REPLY
$ echo -n "Hello" | { read; echo "$REPLY"; } Hello
簡而言之,
read
它不會等待進一步的輸入,因為它注意到輸入流已關閉。也(切線)相關:“保持管道打開”是什麼意思?
你可能會遇到這樣的循環:
while read variable || [ -n "$variable" ]; do # something with "$variable" done
這允許讀取可能沒有被最終換行符正確終止的輸入。如果沒有
-n
測試,並且數據中沒有最後的換行符,最後(非終止)行將被跳過。此循環中使用的
read
實用程序就像一個測試。如果循環連接到的輸入流關閉(read
超過文件末尾的讀取),read
將返回非零退出狀態,並且循環將終止。通過-n
測試,它會進行一次額外的迭代,但額外的迭代只會確認,是的,沒有更多數據要讀取,現在該值$variable
也是空的。