Убить первую команду, как только выйдет вторая
Я долго искал лучшую практику для этого сценария.
Если у меня есть process2, это зависит от процесса, запущенного заранее. Я создал псевдоним, как:
alias both='process1 & process2'
Затем, когда процесс2 завершается, я бы хотел, чтобы процесс1 также завершился (мое текущее решение - вернуться к терминалу и kill %%
).
Например (для подключения к устройству iOS с Mac через USB):
alias usbssh='/usr/local/bin/iproxy 2222 22 & ssh -p 2222 root@localhost'
Как мне сохранить iproxy
работает, и убить его, как только ssh
выходит?
1 ответ
Просто добавить kill $!
к концу: process1 & process2; kill $!
$!
- переменная (в Bash, которая до смешного называется "параметром"), и она будет расширяться до последнего фонового PID где угодно:
Расширяется до идентификатора процесса задания, которое в последний раз помещается в фоновом режиме, независимо от того, выполняется ли оно как асинхронная команда или с помощью встроенной команды bg (см. УПРАВЛЕНИЕ ЗАДАНИЯМИ ниже).
%%
является особенным, и будет расширяться до последнего PID фона только в контексте встроенных команд оболочки, таких как fg
а также kill
, К сожалению, это не ясно из man
страница:
Символы %% и%+ относятся к понятию оболочки текущего задания, которое является последним заданием, остановленным, когда оно находилось на переднем плане или началось в фоновом режиме.
PS: Если вам нужно сделать это командной строкой, убедитесь, что kill $!
в одинарных кавычках, поэтому он расширяется во время выполнения. Еще лучше написать функцию вместо псевдонима, чтобы избежать их ограничений.