Vamos pegar seu primeiro comando e executá-lo em um diretório temporário:
mkdir eg1 # Create temporary directory
cd eg1 # ...and change to it
ls # No output (obviously, no files)
bash -c '(while echo "not printing" ; do sleep 1; done) > "$(tty)" & sleep 10'
Mas agora dê uma olhada no diretório:
ls -l
-rw-r--r--+ 1 roaima roaima 1040 Jun 6 23:05 not a tty
O que aconteceu aqui é que o ttycomando relata o dispositivo terminal, como /dev/pty0quando é executado com um terminal conectado, e a mensagem not a ttycaso contrário. Quando é executado em segundo plano ( &) como um subshell ( ( … )), não há dispositivo de terminal, portanto, a saída é redirecionada para o que é um arquivo chamado not a tty.
Agora, no segundo caso, tudo é muito semelhante, exceto que o subshell não está sendo executado em segundo plano:
Nesta instância ttyestá rodando em primeiro plano e pode retornar o nome do dispositivo do terminal atual, para que você veja a saída na sua tela.
Observe que o &&é um conector lógico de modo que o segundo comando só será executado se o primeiro retornar um status de saída "bem-sucedido" (valor 0). Não confunda com &, que instrui o comando anterior a ser executado independentemente em segundo plano:
# Run the ( ... ) in the background concurrently with the foreground process
( sleep 1; echo background ) & echo foreground; wait
[1] 32301
foreground
background
[1]+ Done ( sleep 1; echo background )
# Run the ( ... ) and then if it's successful execute the next statement
( sleep 1; echo background ) && echo foreground; wait
background
foreground
Dependendo do que você deseja alcançar, você pode considerar usar /dev/tty, ou até mesmo não redirecionar a saída.
Vamos pegar seu primeiro comando e executá-lo em um diretório temporário:
Mas agora dê uma olhada no diretório:
O que aconteceu aqui é que o
tty
comando relata o dispositivo terminal, como/dev/pty0
quando é executado com um terminal conectado, e a mensagemnot a tty
caso contrário. Quando é executado em segundo plano (&
) como um subshell (( … )
), não há dispositivo de terminal, portanto, a saída é redirecionada para o que é um arquivo chamadonot a tty
.Agora, no segundo caso, tudo é muito semelhante, exceto que o subshell não está sendo executado em segundo plano:
Nesta instância
tty
está rodando em primeiro plano e pode retornar o nome do dispositivo do terminal atual, para que você veja a saída na sua tela.Observe que o
&&
é um conector lógico de modo que o segundo comando só será executado se o primeiro retornar um status de saída "bem-sucedido" (valor 0). Não confunda com&
, que instrui o comando anterior a ser executado independentemente em segundo plano:Dependendo do que você deseja alcançar, você pode considerar usar
/dev/tty
, ou até mesmo não redirecionar a saída.