循环只在体内用`ssh`迭代一次

时间:2014-05-29 16:36:36

标签: bash ssh

我经常看到与......基本相同的问题。

<小时/> 当我在循环体中调用while时,我的ssh循环只会迭代一次。

while read -r line; do
    ssh somehost "command $line"
done < argument_list.txt

1 个答案:

答案 0 :(得分:5)

ssh也会从标准输入中读取内容,因此在ssh的下一次调用之前,对argument_list.txt的第一次调用会消耗剩余的read。要解决此问题,请使用

重定向ssh的{​​{1}}标准输入
/dev/null

ssh somehost "command $line" < /dev/stdin

如果ssh -n somehost "command $line" 确实 需要从标准输入读取,您不希望它从ssh读取更多数据。在这种情况下,您需要为while循环使用不同的文件描述符。

argument_list.txt

while read -r line <&3; do ssh somehost "command $line" done 3< argument_list.txt 和其他一些shell也允许bash使用read选项来指定文件描述符,有些人可能会发现它们更具可读性。

-u