pegando o código de saída do processo em segundo plano / subshell

0

Eu estou querendo saber se existe alguma diferença entre:

long_running.sh & 
pid=$!

e

(
  long_running.sh
) & 

pid=$!

o pid será capturado consistentemente nos dois casos, ou haverá algumas diferenças aqui?

Por fim, quero capturar o código de saída significativo com:

wait ${pid} || { echo "damn"; exit 1; };
    
por Alexander Mills 01.05.2018 / 23:24

1 resposta

1

Um pequeno teste mostra que meu comentário anterior está errado:

$ cat long_running.sh 
#!/bin/bash
sleep 3
echo "long_running: $$"
pstree -ps $$
status=$((RANDOM % 2))
echo "exiting with status $status"
exit $status

$ ./long_running.sh
long_running: 6599
systemd(1)───gnome-terminal-(4112)───bash(5899)───long_running.sh(6599)───pstree(6601)
exiting with status 1

$ ( ./long_running.sh )
long_running: 6618
systemd(1)───gnome-terminal-(4112)───bash(5899)───long_running.sh(6618)───pstree(6621)
exiting with status 0

Não existe um shell "man-in-the-middle", por isso suponho que o bash crie um subshell e exec s os comandos.

Para capturar o status de saída, você faz a coisa correta

$ ( ./long_running.sh ) & pid=$!; wait $pid && echo ok || echo damn
[1] 7439
long_running: 7439
systemd(1)───gnome-terminal-(4112)───bash(5899)───long_running.sh(7439)───pstree(7441)
exiting with status 0
[1]+  Done                    ( ./long_running.sh )
ok

$ ( ./long_running.sh ) & pid=$!; wait $pid && echo ok || echo damn
[1] 7457
long_running: 7457
systemd(1)───gnome-terminal-(4112)───bash(5899)───long_running.sh(7457)───pstree(7461)
exiting with status 1
[1]+  Exit 1                  ( ./long_running.sh )
damn
    
por 01.05.2018 / 23:47