whileループ中にsshを使うと1回目のループで終了する

Linux
この記事は約2分で読めます。

shellでwhileを使ってループ処理をするとき、ループ内でsshを使うとループ処理が1階で終了してしまいます。

そういう時はsshのオプション”n”を使うと想定通りに動きます。

 

                 

  1. ループするリストの準備

    1月から12月までを英語で表記したファイル /tmp/monthを用意しました。
    $ cat /tmp/month
    January
    February
    March
    April
    May
    June
    July
    August
    September
    October
    November
    December
    
    January~Decemberまでの12個があります。


  2. whileループをさせてみる

    Ubuntuをインストールしたnp15からssh接続ができるRaspberry Piに対してwhileループ処理をさせてみます。
    $ cat /tmp/month | while read var ; do ssh pi@IPアドレス "echo ${var}" ; done
    January
    $
    1回目のループで終了してしまいました。


  3. 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回目のループで正常終了するとのこと。

ときどきこの手のスクリプトを書くことがあるので注意していきたいです。

コメント

タイトルとURLをコピーしました