1

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

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

我不确定这段代码有什么问题。如果有人可以帮忙,我会非常有帮助。

4

2 回答 2

4

如果runScriptAndCheckError还从标准输入读取,它将从$SCRIPT_FILENAME. 让循环中的read命令while使用不同的文件描述符:

while IFS= read -r line <&3; do
  ...
done 3< "$SCRIPT_FILENAME"
于 2013-04-08T18:39:03.987 回答
0

窃取输入

正如@chepner 所说,关键是里面的语句:

read line; do
   <command>
done

如果他们尝试从标准输入读取,将干扰循环。

如果您不希望脚本从标准输入读取,请按以下方式阻止它:

read line; do
   cmd < /dev/null
done

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

于 2019-03-18T22:19:17.857 回答