Matar o primeiro comando assim que as segundas saídas

4

Estou procurando práticas recomendadas para esse cenário há muito tempo.

Se eu tiver process2 que depende do processo1 em execução de antemão. Eu configurei um alias como:

alias both='process1 & process2'

Então, quando o process2 sair, eu gostaria que o process1 saísse também (minha solução atual é voltar para o terminal e kill %% ).

Por exemplo (para conectar-se a um dispositivo iOS do mac através do usb):

alias usbssh='/usr/local/bin/iproxy 2222 22 & ssh -p 2222 root@localhost'

Como manter iproxy em execução e eliminá-lo assim que ssh sair?

    
por Elist 21.06.2017 / 09:11

1 resposta

4

Basta anexar kill $! ao final: process1 & process2; kill $!

$! é uma variável (confusamente conhecida como "parâmetro" no Bash) e expand para o último PID de fundo em qualquer lugar:

Expands to the process ID of the job most recently placed into the background, whether executed as an asynchronous command or using the bg builtin (see JOB CONTROL below).

%% é especial e só será expandido para o último PID de segundo plano no contexto dos comandos internos do shell, como fg e kill . Infelizmente isso não está claro na página man :

The symbols %% and %+ refer to the shell's notion of the current job, which is the last job stopped while it was in the foreground or started in the background.

PS: Se você precisar fazer isso com uma cadeia de comandos, certifique-se de que kill $! tenha aspas simples para que seja expandido em tempo de execução. Melhor ainda, escreva uma função em vez de um alias para evitar suas limitações .

    
por 21.06.2017 / 09:18