Bash

嵌套讀取語句導致 bash 中的無限循環

  • May 25, 2020

我正在嘗試從命令中讀取文件列表並要求使用者輸入每個文件。我用一個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從標準輸入讀取,因此那裡的兩個reads 都將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函式體。

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