shellでwhileを使ってループ処理をするとき、ループ内でsshを使うとループ処理が1階で終了してしまいます。
そういう時はsshのオプション”n”を使うと想定通りに動きます。
例
- ループするリストの準備
1月から12月までを英語で表記したファイル /tmp/monthを用意しました。12345678910111213$ cat /tmp/monthJanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNovemberDecember - whileループをさせてみる
Ubuntuをインストールしたnp15からssh接続ができるRaspberry Piに対してwhileループ処理をさせてみます。
123$ cat /tmp/month | while read var ; do ssh pi@IPアドレス "echo ${var}" ; doneJanuary$ - forループさせてみる
1234567891011121314$ for var in $(cat /tmp/month) ; do ssh pi@IPアドレス "echo ${var}" ; doneJanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNovemberDecember$
問題なく動作します。
どうすればよいか
sshのオプション”n”を使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ 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回目のループで正常終了するとのこと。
ときどきこの手のスクリプトを書くことがあるので注意していきたいです。
コメント