![forループとwhileループの結果が異なるのはなぜですか? [コピー]](https://linux33.com/image/58322/for%E3%83%AB%E3%83%BC%E3%83%97%E3%81%A8while%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%8C%E7%95%B0%E3%81%AA%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
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