この質問にはすでに回答があります :SSHによりwhileループが停止します
(1つの回答)
4年前に閉鎖されました。
Linux
(1つの回答)
4年前に閉鎖されました。
2つのスクリプトがあります:
foo.sh:
#!/bin/bash
echo -e "onentwo" |
while read line; do
cat not-existing
echo hello $line
done
bar.sh:
#!/bin/bash
echo -e "onentwo" |
while read line; do
ssh [email protected] 'cat not-existing' # Here is the only difference
echo hello $line
done
そして今、私はそれらを実行します
$ ./foo.sh
cat: not-existing: No such file or directory
hello one
cat: not-existing: No such file or directory
hello two
$ ./bar.sh
cat: not-existing: No such file or directory
hello one
bar.sh
の出力 私には驚きです。両方のスクリプトで同じになると思います。
foo.sh
の出力がなぜですか およびbar.sh
異なる?バグですか、それとも機能ですか?
注
以下は私が期待するとおりに機能します。つまり、これの出力はfoo.sh
の出力と同じです。 :
#!/bin/bash
for line in `echo -e "onentwo"`; do
ssh [email protected] 'cat not-existing'
echo hello $line
done
なぜですか?
承認された回答:
bar.sh
内 、two
ssh
によって消費されます 。最後の例では、echo
からの完全な出力 for
によって使用されます ループを開始する前。
ssh
を避けるため 標準入力からデータを取得するには、ssh -n
を使用します 。これにより、ssh
の標準入力が接続されます /dev/null
を使用 while
の標準入力ではなく ループ。
これにより、期待どおりの結果が得られます:
#!/bin/bash
echo -e "onentwo" |
while read line; do
ssh -n [email protected] 'cat not-existing' # Here is the only difference
echo hello $line
done
書いた場合
#!/bin/bash
echo -e "onentwo" |
while read line; do
ssh [email protected] 'cat'
echo hello $line
done
次にcat
リモートマシンでは、two
が出力されます。 その標準入力はssh
から受け継がれているため ループとecho
から取得しました 。 two
を出力します one
ではなく 入力の最初の行はすでにread
によって消費されているため 。