Bash
嵌套讀取語句導致 bash 中的無限循環
我正在嘗試從命令中讀取文件列表並要求使用者輸入每個文件。我用一個
read
來讀取文件名,另一個來獲取使用者輸入,但是這個腳本似乎進入了一個無限循環。foo () { echo "a\nb\nc" | while read conflicted_file; do echo $conflicted_file while true; do read -e -p "> " yn case $yn in [nN]* ) echo "success"; break;; [yY]* ) echo "fail"; break;; * ) echo "invalid input";; esac done done; } foo
移除外部
while read
似乎可以解決問題。任何想法為什麼?
read
從標準輸入讀取,因此那裡的兩個read
s 都將echo
通過在其標準輸入上打開的同一管道從輸出中讀取。對於
read
從管道外部的標準輸入讀取的循環內部,您可以執行以下操作:foo () { printf 'a\nb\nc\n' | while IFS= read -r conflicted_file; do printf '%s\n' "$conflicted_file" while true; do IFS= read <&3 -re -p "> " yn case $yn in [nN]* ) echo "success"; break;; [yY]* ) echo "fail"; break;; * ) echo "invalid input";; esac done done } 3<&0
也就是說,將它複製到 fd 3 上,用於整個
foo
函式體。