質問: 例えば以下のようなシェルスクリプト(hoge.sh)があるとします。 ``` #!/bin/sh gradle build #<- build はなくても結果は同じ echo "hello" ``` プロンプトで ``` ./hoge.sh ``` を行うと、ビルドを行い ハローといってくれます。 しかし、 ``` cat hoge.sh | /bin/sh ``` を行うと、`gradle build`はBUILD SUCCESSFULと表示されるのですが、ハローまで到達せずにスクリプトが終わっている模様です。 仮に、 ``` cat hoge.sh | /bin/sh -i ``` としてみますと、 ``` sh-4.2$ #!/bin/sh sh-4.2$ gradle build ..... Gradleのメッセージ sh-4.2$ exit ``` と出ています。この`exit`のせいで`echo "hello"`が無視されているようです。 用いているGradleは3.2.1で 2.1だと同じようにしても`exit`は呼ばれずハローが帰ります。 スクリプトの2行目の`gradle build` に何か加えたり `cat hoge.sh | /bin/sh`に何かしたりするなどして`exit`を回避できないでしょうか?
回答: `gradle` コマンドが標準入力を開いてすぐ閉じているようで、これが原因です。 標準入力でシェルにコマンドを送り込んでいると、`gradle` 起動以降の入力を `gradle`が全部読んでしまう(読まずに閉じてしまう?)模様です。 ``` gradle < /dev/null echo "Hello" ``` などとして、`gradle`の標準入力に別の物を割り当てておけば大丈夫です。 (Gradle ユーザの方は `gradle`が標準入力を開いて何をしようとしているのか、確認しておいた方がよいかも知れませんが、バグっぽい挙動だなと思いました) 以下、最初の検証。 不思議な現象ですね。 とりあえず分かった事。 * `bash`、`zsh`、`ksh` で再現する。 `dash`、`busybox`では再現しない。 * `gradle --no-daemon` とすると再現しない。 * シェルに`gradle`の実行前に後続行を読み込ませておけば、再現しない。 最後のは例えばこういう事です。 ``` gradle; { echo X--X echo Y--Y } ```