Suas sub shells não são interativas; somente os shells interativos são mortos automaticamente.
Espero que o título esteja correto e não seja enganoso. Tentei ser específico sobre algo sobre o qual não sei muito. Para ser mais geral, eu me pergunto por que alguns comandos bash semelhantes se comportam da maneira que eles fazem.
Eu tenho um script bash foo
:
#!/usr/bin/env bash
while true
do
echo "reading"
read data
echo $data
echo "stderr msg" >&2
sleep 1
done
É um loop infinito que lê uma linha por vez a partir de stdin e produz a mesma linha. Eu também tenho um script bash bar
:
#!/usr/bin/env bash
./foo &
Os seguintes comandos foram executados em bash
(v. 4.4.19) em um terminal no Ubuntu 18.04 (suponhamos que os scripts residam no diretório de trabalho):
1) ./foo &
Pára quando tenta ler de stdin, de acordo com esta resposta .
Matado quando o terminal de controle é eliminado, como esperado.
2) (./foo &)
Parece ser continuamente alimentado automaticamente com nova entrada de stdin. Não deveria também parar ao tentar ler de stdin? O que quer que ele esteja comprando, não aparece quando ecoado, então eu acho que são caracteres EOF.
Continua a correr mesmo depois do terminal de controlo ser eliminado. Olhando para a saída de ps
, o terminal de controle muda de pts / x para?. Como isso aconteceu sem o uso de disown
ou nohup
? (No entanto, depois de matar o terminal de controle original, ele produz um "erro de gravação: erro de entrada / saída" em cada gravação, o que eu suponho é porque seu stdout estava vinculado ao terminal agora fechado.)
3) bash -c "./foo &"
parece se comportar exatamente como 2).
4) ./bar
parece se comportar exatamente como 2) e 3).
5) Adicionando bash -c "~/foo"
(não &
) como um aplicativo de inicialização
Comporta-se de forma semelhante a 2), 3) e 4), com as diferenças:
Nenhuma dessas diferenças parece estranha para mim, apenas o fato de que ela é continuamente alimentada com novas entradas.
Meu palpite é que 2) - 5) todos usam um subnível de tipos cujo stdin é redirecionado para algo como /dev/null
, embora eu esteja muito inseguro e busque uma resposta mais exata.
Suas sub shells não são interativas; somente os shells interativos são mortos automaticamente.