Большинство оболочек предоставляют такие функции, как &&
и ;
цепочка выполнения команд определенным образом. Но что, если команда уже запущена, могу ли я как-то добавить еще одну команду, которая будет выполняться в зависимости от результата первой?
Скажи я побежал
$ /bin/myprog
some output...
но я очень хотел /bin/myprog && /usr/bin/mycleanup
. Я не могу убить myprog
и перезапустить все, потому что слишком много времени будет потеряно. Я могу Ctrl+ Zэто и fg
/ bg
при необходимости. Позволяет ли это мне соединиться в другой команде?
В основном меня интересует bash, но ответы на все распространенные оболочки приветствуются!
%
,%1
и$!
. Важно указать PID, иначе всегда будет работать вторая команда.wait
не сможет обеспечить желаемый результат. Обычно используются короткие формы, так как они менее подвержены опечаткам.fg
возвращается с кодом выхода из программы, которую он возобновляет. Поэтому вы можете приостановить вашу программу с помощью, ^Zа затем использоватьfg && ...
для ее возобновления.источник
myprog
во второй раз приводитfg
к завершению с кодом завершения 20, который не равен нулю, поэтому связаннаяmycleanup
команда не выполняется.Не уверен, что то, что вы запрашиваете, возможно, но если у вас все еще есть оболочка, из которой вы запустили программу, вы всегда можете проверить состояние
$?
завершения последнего процесса:источник
wait
команду в Bash.Если задание находится на переднем плане, любая из этих команд будет работать так же, как вы ожидаете.
ПРИМЕЧАНИЕ: $? будет содержать статус возврата работающей программы при выходе.
Это явно указывает, что будет делать оболочка, если вы изначально ввели команду.
Если первая команда не читает
stdin
и выполняется на переднем плане, новая команда может быть введена во время выполнения первой команды. Оболочка прочитает и выполнит ее при выполнении первой команды. Если команда будет работать в фоновом режиме, вряд ли она читаетstdin
.РЕДАКТИРОВАТЬ:
WAIT
Также можно использовать задание в фоновом режиме и использовать команду. Это должно быть сделано с осторожностью, если другие задания также выполнялись в фоновом режиме. В спецификации задания требуется, чтобыWAIT
команда возвращала статус ожидаемого задания.источник
wait
тоже не идеально. Преимущество IMO заключается в том, что он дает нам более понятный API, с которым мы имеем дело. Вводить больше команд в командной строке после запуска чего-либо мне показалось немного странным.wait
по-прежнему страдает от отсутствия прямой ссылки на работающий PID, по сравнению с состоянием возврата. Похоже, это проблема больше, поскольку Bash реализует некоторые вещи: stackoverflow.com/questions/356100/… . Так что это может быть так же хорошо, как и получается.