Bash

Bash:如何從命令的輸出中一次讀取一行?

  • June 11, 2021

我正在嘗試使用 bash 讀取命令的輸出while loop

while read -r line
do
   echo "$line"
done <<< $(find . -type f)

我得到的輸出

ranveer@ranveer:~/tmp$ bash test.sh
./test.py ./test1.py ./out1 ./test.sh ./out ./out2 ./hello
ranveer@ranveer:~/tmp$ 

在此之後我嘗試了

$(find . -type f) | 
while read -r line
do
   echo "$line"
done 

但它產生了一個錯誤test.sh: line 5: ./test.py: Permission denied

那麼,我如何逐行閱讀它,因為我認為目前它正在一次吞下整行。

所需輸出:

./test.py
./test1.py
./out1
./test.sh
./out
./out2
./hello

有錯誤,< <(command)不需要<<<$(command)

< <( )Process Substitution$()命令替換並且<<<here-string

請注意,沒有什麼可以阻止文件名包含換行符。為 find找到的每個文件執行命令的規範方法是。

find . -type f -exec cmd {} \;

如果你想在 bash 中完成一些事情:

find . -type f -exec bash -c '
 for file do
   something with "$file"
 done' bash {} +

此外,在腳本中呼叫“讀取”命令的規範方法(如果您不希望它對輸入進行額外處理)是:

IFS= read -r var

-r是停止read專門處理反斜杠字元(作為分隔符和換行符的轉義字元),並且 IFS= 將分隔符列表設置為空字元串read(否則,如果該列表中有任何空白字元,它們將從輸入的開始和結束)。

在 shell 中使用循環通常是一個壞主意(而不是在 shell 中如何完成事情,在這種情況下,您可以讓多個工具共同工作並同時執行一項任務,而不是按順序執行一個或多個工具數百次)。

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