GNU/Linux >> Linux の 問題 >  >> Linux

シェルスクリプトの予期しない動作?

この質問にはすでに回答があります :SSHによりwhileループが停止します

(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によって消費されているため 。


Linux
  1. Ssh – Sshサーバーにログインするためのシェルスクリプト?

  2. シェルスクリプトでタイムアウトしますか?

  3. シェルスクリプトを使用して /etc/hosts ファイルに行を追加します

  1. 関数とパラメータを変数として持つシェルスクリプト?

  2. 一致する`"‘を探しているときに予期しないEof – Bashスクリプト?

  3. シェルスクリプトを使用して HTML メールを送信する

  1. シェル スクリプトを使用してデータベース接続を確認する

  2. Linux シェルスクリプトからメールを送信する

  3. シェル スクリプトを使用してユーザーを sudoers に追加する