shellでwhileを使ってループ処理をするとき、ループ内でsshを使うとループ処理が1階で終了してしまいます。
そういう時はsshのオプション”n”を使うと想定通りに動きます。
例
- ループするリストの準備
1月から12月までを英語で表記したファイル /tmp/monthを用意しました。$ cat /tmp/month January February March April May June July August September October November December
January~Decemberまでの12個があります。 - whileループをさせてみる
Ubuntuをインストールしたnp15からssh接続ができるRaspberry Piに対してwhileループ処理をさせてみます。
$ cat /tmp/month | while read var ; do ssh pi@IPアドレス "echo ${var}" ; done January $1回目のループで終了してしまいました。 - forループさせてみる
$ for var in $(cat /tmp/month) ; do ssh pi@IPアドレス "echo ${var}" ; done January February March April May June July August September October November December $
問題なく動作します。
どうすればよいか
sshのオプション”n”を使います。
$ cat /tmp/month | while read var ; do ssh -n pi@IPアドレス "echo ${var}" ; done
January
February
March
April
May
June
July
August
September
October
November
December
$
想定通りの動きになりました。
原因ですが、通常はwhile read で1行ずつ読み込まれますが、sshを使用するとwhile readでリスト全体が読み込まれるため、1回目のループで正常終了するとのこと。
ときどきこの手のスクリプトを書くことがあるので注意していきたいです。


コメント