A maioria dos shells fornece funções como &&
e ;
encadear a execução de comandos de certas maneiras. Mas e se um comando já estiver em execução, ainda assim posso adicionar outro comando a ser executado, dependendo do resultado do primeiro?
Diga que eu corri
$ /bin/myprog
some output...
mas eu realmente queria /bin/myprog && /usr/bin/mycleanup
. Não posso matar myprog
e reiniciar tudo, porque muito tempo seria perdido. Eu posso Ctrl+ Ze fg
/ bg
se necessário. Isso me permite encadear outro comando?
Estou interessado principalmente no bash, mas as respostas para todas as conchas comuns são bem-vindas!
%
,%1
e$!
. É importante fornecer o PID ou o segundo comando sempre será executado.wait
falhará em fornecer o resultado desejado. É comum usar os formulários curtos, pois são menos propensos a erros de digitação.fg
retorna com o código de saída do programa em que é retomado. Portanto, você pode suspender seu programa ^Ze usáfg && ...
-lo para continuar.fonte
myprog
pela segunda vez fazfg
com que o código de saída 20 seja finalizado - diferente de zero, portanto omycleanup
comando em cadeia não é executado.Não tenho certeza se o que você está pedindo é possível, mas se você ainda possui o shell do qual iniciou o programa, sempre pode verificar
$?
o status de saída do último processo:fonte
wait
comando no Bash.Se o trabalho estiver em primeiro plano, qualquer um desses comandos terá o mesmo comportamento esperado.
NOTA: $? conterá o status de retorno do programa em execução quando ele sair.
Isso indica explicitamente o que o shell faria se você tivesse digitado o comando originalmente.
Se o primeiro comando não estiver lendo
stdin
e estiver sendo executado em primeiro plano, o novo comando poderá ser inserido enquanto o primeiro comando estiver em execução. O shell irá lê-lo e executá-lo quando o primeiro comando for executado. Se o comando for executado em segundo plano, é improvável que esteja lendostdin
.EDIT: Colocar o trabalho em segundo plano e usar o
WAIT
comando também pode ser usado. Isso deve ser feito com cuidado se outros trabalhos também foram executados em segundo plano. Uma especificação de trabalho é necessária para que oWAIT
comando retorne o status do trabalho aguardado.fonte
wait
também não é ideal. A vantagem, IMO, é que ela nos fornece uma API mais clara com a qual estamos lidando. Digitar mais comandos na linha de comando depois que algo está em execução parecia um pouco hacky para mim.wait
ainda sofre por não obter um link direto para o PID em execução, escreve o status de retorno. Este parece ser um problema mais com o modo como o Bash implementa as coisas: stackoverflow.com/questions/356100/… . Portanto, isso pode ser o melhor possível.