forループとwhileループの結果が異なるのはなぜですか? [コピー]

forループとwhileループの結果が異なるのはなぜですか? [コピー]

forループがあります。

for host in $(cat ./hosts)
do
   echo -e "$host"
   ssh -o "StrictHostKeyChecking no" $host "uptime" 2>/dev/null
   echo -e "\n"
done

上記のforループとまったく同じことを行うwhileループです。

while read host
do
   echo -e "$host"
   ssh -o "StrictHostKeyChecking no" $host "uptime" 2>/dev/null
   echo -e "\n"
done <./hosts

Hostsはforループとwhileループを含むスクリプトと同じ場所にあるファイルで、リモートサーバーの一部のホスト名を含みます。 forループは(ホストファイルにリストされているすべてのホストに対して)期待される結果を出力しますが、whileループの場合は最初のホストのみを印刷して終了uptimeします。

ホストファイルには、1行に1つのホスト名が含まれます。

問題は、なぜこれら2つのループが異なる動作をするのかです。

答え1

問題は、sshが標準入力から読み取られるので、残りの行をすべて食べるということです。標準入力はどこからでも接続できます。

$ ssh -o "StrictHostKeyChecking no" $host "uptime" 2>/dev/null < /dev/null

引用する

関連情報