mito’s blog

IT技術メインの雑記。思い立ったが吉日。

【bash】while readでjarファイルを実行すると、1行目で止まる

やりたいこと

テキストにまとめたJenkinsプラグインのインストールをスクリプトで自動化したい。


各ファイルの準備

スクリプトプラグインをまとめたテキストを用意します。

while read line
do
  java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin $line
done < plugins.txt
  • プラグインをまとめたテキスト(本当は100個近くある)
git:4.11.0
github:1.34.3
credentials:1087.1089.v2f1b_9a_b_040e4
plain-credentials:1.8
plugin-util-api:2.16.0


while readで実行した結果

スクリプトを実行してみます。

$ sh install.sh
Installing git:4.11.0 from update center
$

1行しか実行されません。

試しにデバッグオプションで実行してみます。

$ sh -x install.sh
+ read line
+ java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin git:4.11.0
Installing git:4.11.0 from update center
+ read line
$

読み込む行がなくなった??

分からんので、試しにスクリプトを書き換えてecho表示してみます。

while read line
do
  echo $line
done < plugins.txt

期待通りに全行表示されるし、デバッグオプションで実行しても問題ないです。

$ sh install.sh
git:4.11.0
github:1.34.3
credentials:1087.1089.v2f1b_9a_b_040e4
plain-credentials:1.8
plugin-util-api:2.16.0
$ 
$ sh -x install.sh
+ read line
+ echo git:4.11.0
git:4.11.0
+ read line
+ echo github:1.34.3
github:1.34.3
+ read line
+ echo credentials:1087.1089.v2f1b_9a_b_040e4
credentials:1087.1089.v2f1b_9a_b_040e4
+ read line
+ echo plain-credentials:1.8
plain-credentials:1.8
+ read line
+ echo plugin-util-api:2.16.0
plugin-util-api:2.16.0
+ read line
$


調べた結果

どうやらファイルを開いて1行目を読んだ後、javaコマンドを実行する際にファイルが閉じられるようです。 そのため、1行目しか読み込まれないと。

1行目を読み込んで実行した後、2行目以降から最終行まで一度にjavaコマンドが読み込んでいるようです。 ※コメントいただいて確認したところ、上記の解釈は違っていたので訂正

解決の糸口になったのが以下記事です。 SSHでも同じ事象になるようです。本当に助かりました。

http://site.m-bsys.com/error/whileread-ssh

じゃあどう解決したかというと、for line inに書き直しました。


for line in で期待通りの動作を実現

まずは、スクリプトをfor line inに書き直します。

for line in `cat plugins.txt`
do
  java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin $line
done

早速実行してみます。

$ sh install.sh
Installing git:4.11.0 from update center
Installing github:1.34.3 from update center
Installing credentials:1087.1089.v2f1b_9a_b_040e4 from update center
Installing plain-credentials:1.8 from update center
Installing plugin-util-api:2.16.0 from update center
$

期待下通りの結果になりました。

デバッグオプションを付けても同様です。

$ sh -x install.sh
++ cat plugins.txt
+ for line in '`cat plugins.txt`'
+java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin git:4.11.0
Installing git:4.11.0 from update center
+ for line in '`cat plugins.txt`'
+java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin github:1.34.3
Installing github:1.34.3 from update center
+ for line in '`cat plugins.txt`'
+java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin credentials:1087.1089.v2f1b_9a_b_040e4
Installing credentials:1087.1089.v2f1b_9a_b_040e4 from update center
+ for line in '`cat plugins.txt`'
+java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin plain-credentials:1.8
Installing plain-credentials:1.8 from update center
+ for line in '`cat plugins.txt`'
+java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin plugin-util-api:2.16.0
Installing plugin-util-api:2.16.0 from update center
$


その他

ほんとはまった!