我正在尝试运行一个包含一系列命令/脚本的文件来运行参数,例如:
ls /etc/
cat /etc/hosts/
script.sh some parameters
...
这似乎工作正常,但在某些情况下,while循环会过早结束。只有在它执行的脚本最后包含SSH / SCP时才会出现这种情况。读取文件的代码:
while IFS= read -r line
do
# Cut command and parameters
IFS=', ' read -a parameters <<< "$line"
cmd="${parameters[0]}"
unset parameters[0]
runScriptAndCheckError "$cmd" "${parameters[@]}"
done < "$SCRIPT_FILENAME"
使用set -x时:
+ checkError 0 'ERROR: script.sh failed'
+ '[' 0 -ne 0 ']'
+ IFS=
+ read -r line
虽然文件中仍有行,但看起来没有更多输入。如果我注释掉runScriptAndCheckError“$ cmd”“$ {parameters [@]}”那么它会打印更多行。
我不确定此代码有什么问题。如果有人能帮忙,我会非常乐于助人。
答案 0 :(得分:4)
如果runScriptAndCheckError
也从标准输入读取,它将从$SCRIPT_FILENAME
读取行。让read
循环中的while
命令使用不同的文件描述符:
while IFS= read -r line <&3; do
...
done 3< "$SCRIPT_FILENAME"
答案 1 :(得分:0)
关键在于@chepner所说的,里面的语句:
read line; do
<command>
done
如果尝试从stdin读取,将会干扰循环。
如果您不希望从stdin中读取脚本,请按以下步骤阻止它:
read line; do
cmd < /dev/null
done
现在,您的读取循环将不会丢失任何输入。