Bash

儘管不使用換行符,但在管道期間如何終止輸入?

  • April 20, 2020

當我給出這個命令時:

$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也是空的。

引用自:https://unix.stackexchange.com/questions/581276