Processo em segundo plano do comportamento estranho do subshell

1

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:

  • Seu terminal de controle é a área de trabalho tty x .
  • Você não pode (pode?) matar seu terminal de controle.

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.

    
por gblomqvist 09.08.2018 / 00:27

1 resposta

0

Suas sub shells não são interativas; somente os shells interativos são mortos automaticamente.

    
por 09.08.2018 / 00:55