Если у вас где-то есть exec something
(в вашем случае - gradlew
), вы заменяете текущий образ процесса (bash
) чем-то другим (java
).
С help exec
:
exec [-cl] [-a имя] [команда [аргументы ...]] [перенаправление ...]
Замените оболочку на данную команду.
Так что проблема не в том, что stdin закрывается, происходит то, что новый процесс (java
) будет тем, кто читает этот ввод ( "echo DONE ") и, вероятно, ничего с этим не делать.
Объяснение с примером
Рассмотрим этот скрипт .sh:
#!/bin/bash
echo Hello
exec cat
echo World
Если вы выполните его, предоставив ввод для cat
:
$ ./script.sh <<< "Nice"
Hello
Nice
Вы также можете ожидать, что на экране будет напечатано слово World ... НЕПРАВИЛЬНО!
Здесь ничего не происходит, потому что после команды exec
выполняется все остальное.
Теперь, если вы передадите скрипт bash:
$ cat script.sh | bash
Hello <- bash interpreted "echo Hello" and printed Hello
echo World <- cat read "echo World" and printed it (no interpertation ocurred)
Здесь вы можете четко увидеть замену образа процесса в действии.