Mata el primer comando tan pronto como salga el segundo

Mata el primer comando tan pronto como salga el segundo

He estado buscando las mejores prácticas para este escenario durante mucho tiempo.

Si tengo el proceso2, eso depende de que el proceso1 se ejecute de antemano. Configuré un alias como:

alias both='process1 & process2'

Luego, cuando el proceso2 salga, me gustaría que el proceso1 también salga (mi solución actual es volver a la terminal y kill %%).

Por ejemplo (para conectarse a un dispositivo iOS desde Mac a través de USB):

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

¿Cómo sigo iproxyejecutando y lo mato tan pronto como sshsale?

Respuesta1

Simplemente agregue kill $!al final:process1 & process2; kill $!

$!es una variable (conocida confusamente como "parámetro" en Bash) yexpandiral último PID de fondo en cualquier lugar:

Se expande al ID de proceso del trabajo colocado más recientemente en segundo plano, ya sea que se ejecute como un comando asíncrono o usando el comando bg incorporado (consulte CONTROL DE TRABAJO a continuación).

%%es especial y solo se expandirá al último PID de fondo en el contexto de comandos integrados del shell como fgy kill. Lamentablemente, esto no queda claro en la manpágina:

Los símbolos %% y %+ se refieren a la noción del shell del trabajo actual, que es el último trabajo detenido mientras estaba en primer plano o iniciado en segundo plano.


PD: Si necesita convertir esto en una cadena de comando, asegúrese de que kill $!esté entre comillas simples para que se expanda en tiempo de ejecución. Aún mejor, escriba una función en lugar de un alias para evitar sulimitaciones.

información relacionada