Bash:在从文件中读取时提前终止

时间:2013-04-08 18:01:05

标签: bash scripting

我正在尝试运行一个包含一系列命令/脚本的文件来运行参数,例如:

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 [@]}”那么它会打印更多行。

我不确定此代码有什么问题。如果有人能帮忙,我会非常乐于助人。

2 个答案:

答案 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

现在,您的读取循环将不会丢失任何输入。