Существует ли процесс, который не посылает EOF перед завершением и как его создать?

Ни man [, ни [--help ] не работают

На некоторых дистрибутивах (например, Ubuntu), man [ следует символической ссылке на test (1) . На других (например, Arch) это не так. (Но справочная страница test также документирует использование [])


type -a [ показывает, что есть как встроенная оболочка, так и исполняемый файл.

$ type -a [
[ is a shell builtin
[ is /usr/bin/[

bash-builtin [--help просто выводит сообщение об ошибке. (Но так как это встроенная функция, вы можете использовать help [ или посмотреть справочную страницу / docs bash).

/ usr / bin / [--help выводит полную справку (для версии GNU Coreutils), которая начинается с:

$ /usr/bin/[ --help
Usage: test EXPRESSION
  or:  test
  or:  [ EXPRESSION ]
  or:  [ ]
  or:  [ OPTION
Exit with the status determined by EXPRESSION.

      --help     display this help and exit
      --version  output version information and exit

и затем описывает разрешенный синтаксис для EXPRESSION.

Это еще один способ узнать, что [ и test эквивалентны.


Кстати, если вы программируете для bash (или пишете однострочники в интерактивном режиме), я бы рекомендовал [[ вместо []. Лучше несколькими способами, см. Ссылки в ответе Серга.

1
19.08.2017, 23:26
2 ответа

EOFна самом деле не "отправляется". Это событие, когда ваш процесс вызывает системный вызов readи возвращает 0, что для каналов происходит, когда другой конец канала закрыт (всеми процессами, у которых он есть, если файловый дескриптор дублируется).

Ядро всегда будет закрывать всефайловые дескрипторы при завершении процессов. Обойти это невозможно (даже файловые дескрипторы SIGKILL-процессов закрываются). Если какой-либо из этих файловых дескрипторов является последней ссылкой на конец записи файлового дескриптора конвейера, следующее чтениев соответствующем конце чтения вернет 0, что stdioбудет интерпретировано как EOF. .

4
27.01.2020, 23:24

Вероятно, это не проблема, если отправляется несколько символов EOF. Таким образом, вы можете запустить свою Java-программу вместе с кодом оболочки, который выводит EOFпосле выхода из Java-программы.

( javaprog ; echo -n $'\4' ) | program_waiting_for_eof

Тем не менее, необходима некоторая конфигурация для обработки сигналов, чтобы гарантировать, что процесс Java будет уничтожен, но последующий код все еще будет выполняться. Если это подходящий подход для вас (который вы можете протестировать, уничтожив процесс Java напрямую с помощью kill $PIDс другого терминала), то я могу предоставить дополнительную информацию, как это сделать, если вам это нужно.

-2
27.01.2020, 23:24

Теги

Похожие вопросы