Bash
Bash:如何從命令的輸出中一次讀取一行?
我正在嘗試使用 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 中如何完成事情,在這種情況下,您可以讓多個工具共同工作並同時執行一項任務,而不是按順序執行一個或多個工具數百次)。