Fim da sessão se o comando exit for executado em paralelo com um comando diferente

1

Eu encontrei um comportamento de shell que eu não entendo. Quando você executa

echo foo > /tmp/bar & exit

, o terminal está fechado. Mas quando você executa

exit & echo foo > /tmp/bar

, o terminal fica aberto e algo como

[1] 4001

é impresso nele.

A saída da primeira versão também pode ser vista se você fizer login em uma conta diferente usando su , porque, então, apenas a sessão do usuário com a qual você fez login usando su será encerrada e seu terminal permanecerá abrir. É algo como:

[2] 13777
exit
[1]+  Done                    exit

Por que a sessão não termina se exit for o primeiro comando?

Caso você não consiga replicar isso no seu sistema Unix: Estou usando o Ubuntu 16.04.

    
por UTF-8 09.12.2016 / 21:10

1 resposta

4

Seu primeiro comando,

echo foo > /tmp/bar & exit

inicia um subshell em segundo plano para executar echo foo > /tmp/bar e sai (o shell em primeiro plano). Isso fecha seu terminal, da mesma maneira que simplesmente digitar exit . O escudo de fundo não ficará por muito tempo, então você não terá uma corrida; mas se você fizer isso com um comando de execução mais longa, dependendo do seu shell e de suas opções, você terá comportamentos diferentes:

sleep 60 & exit

pode não sair, mas reclamar que você tem trabalhos em execução.

Em ambos os casos, o shell imprime uma linha do formulário [1] 7149 , mas se o seu terminal fechar, você não terá tempo de vê-lo.

Seu segundo comando,

exit & echo foo > /tmp/bar

inicia um subshell em segundo plano para executar exit , que sai (do subshell) e executa echo foo > /tmp/bar . Então o shell “principal” não sai e o terminal fica aberto, o que permite que você veja

[2] 13777

seguido por

exit

(impresso pela saída do shell) e depois

[1]+  Done                    exit

(impresso pelo shell principal quando o shell de fundo sai).

    
por 09.12.2016 / 22:25