30949


例えば以下のようなシェルスクリプト(hoge.sh)があるとします。

[code]

    #!/bin/sh
    gradle build #<- build はなくても結果は同じ
    echo "hello"
    
[/code]

プロンプトで

[code]

    ./hoge.sh
    
[/code]

を行うと、ビルドを行い ハローといってくれます。

しかし、

[code]

    cat hoge.sh | /bin/sh
    
[/code]

を行うと、`gradle build`はBUILD SUCCESSFULと表示されるのですが、ハローまで到達せずにスクリプトが終わっている模様です。

仮に、

[code]

    cat hoge.sh | /bin/sh -i
    
[/code]

としてみますと、

[code]

    sh-4.2$ #!/bin/sh
    sh-4.2$ gradle build
    ..... Gradleのメッセージ
    sh-4.2$ exit
    
[/code]

と出ています。この`exit`のせいで`echo "hello"`が無視されているようです。

用いているGradleは3.2.1で 2.1だと同じようにしても`exit`は呼ばれずハローが帰ります。

スクリプトの2行目の`gradle build` に何か加えたり `cat hoge.sh |
/bin/sh`に何かしたりするなどして`exit`を回避できないでしょうか？


CC BY-SA 3.0
2016-12-06T03:20:52.313
30942
2016-12-06T12:58:14.477
10768
question
shellscript gradle
シェルスクリプト内でgradleを呼ぶとそれ以降の処理がなされない


`gradle` コマンドが標準入力を開いてすぐ閉じているようで、これが原因です。  
標準入力でシェルにコマンドを送り込んでいると、`gradle` 起動以降の入力を `gradle`が全部読んでしまう（読まずに閉じてしまう？）模様です。

[code]

    gradle < /dev/null
    echo "Hello"
    
[/code]

などとして、`gradle`の標準入力に別の物を割り当てておけば大丈夫です。

（Gradle ユーザの方は
`gradle`が標準入力を開いて何をしようとしているのか、確認しておいた方がよいかも知れませんが、バグっぽい挙動だなと思いました）

* * *

以下、最初の検証。

不思議な現象ですね。  
とりあえず分かった事。

  * `bash`、`zsh`、`ksh` で再現する。  
`dash`、`busybox`では再現しない。

  * `gradle --no-daemon` とすると再現しない。

  * シェルに`gradle`の実行前に後続行を読み込ませておけば、再現しない。

最後のは例えばこういう事です。

[code]

    gradle; {
    echo X--X
    echo Y--Y
    }
    
[/code]


CC BY-SA 3.0
2016-12-06T06:50:25.403
30949
2016-12-06T12:58:14.477
2016-12-06T12:58:14.477
3054
3054
30942
answer