Почему запуск gradlew в неинтерактивном сеансе bash закрывает стандартный сеанс? - PullRequest
0 голосов
/ 03 мая 2018

Я заметил эту странную проблему с успешным завершением сценариев на ранних этапах системы CI при использовании gradlew. Следующие шаги помогут обрисовать это в общих чертах.

  1. Создайте файл с именем script с содержанием:

    ./gradlew
    echo DONE
    
  2. Получить случайный gradlew откуда-то

  3. Выполнить cat script | bash

Обратите внимание, что DONE никогда не появляется

AFAICT, запуск bash неинтерактивно заставляет exec java blah в конце gradlew каким-то образом разрешать java закрывать стандартный ввод и никогда не позволять читать echo DONE из сценария, считываемого через стандартный ввод из cat. Подтверждающие факты этого:

  • Если изменить скрипт на ./gradlew; echo DONE, будет напечатано DONE
  • Замена ./gradlew на ./gradlew < /dev/null напечатает DONE

1 Ответ

0 голосов
/ 03 мая 2018

Если у вас где-то есть 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)

Здесь вы можете четко увидеть замену образа процесса в действии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...