Уничтожьте первую команду, как только завершится вторая.

Уничтожьте первую команду, как только завершится вторая.

Я долго искал наилучшую практику для этого сценария.

Если у меня есть процесс2, который зависит от процесса1, запущенного заранее. Я настраиваю псевдоним, например:

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 $!что она заключена в одинарные кавычки, чтобы она была расширена во время выполнения. Еще лучше, напишите функцию вместо псевдонима, чтобы избежать ихограничения.

Связанный контент