read -t 3(uma ksh93extensão agora também suportada por zsh, bashe mksh) destina-se a ler uma linha ( a linha lógica nessas linhas pode ser continuada com uma barra invertida à direita, pois você não usa a -ropção) de stdin para $REPLYum tempo limite de 3 segundos.
Se stdin for um terminal, ele ficará inativo por 3 segundos, a menos que o usuário pressione enter (e o script será suspenso com um sinal SIGTTIN se for iniciado em segundo plano).
Se for um arquivo normal, ele lerá essa linha e retornará imediatamente. Se for /dev/zero, fará uma leitura muito ocupada de gigabytes de zeros a partir daí, etc.
nohupé o comando que você usa para desanexar um comando de um terminal. Ele redireciona stdin para /dev/nulle stdout e stderr para nohup.out. Portanto, normalmente você não gostaria de ler do terminal nesse caso.
readem /dev/nullretorna imediatamente sem nenhum dado retornado, /dev/nullé para isso que serve.
Se o objetivo do uso read -té ter um tipo de sono que pode ser interrompido pelo usuário (pressionando Enter) como quando você deseja dar a ele tempo para ler uma mensagem que ele pode pular, read -tretornando imediatamente quando não interativo (como quando executado sob nohup) pareceria a coisa certa a fazer, pois não há motivo para atrasar o script.
Mas se você quiser ler do terminal com tempo limite se stdin for um terminal e dormir caso contrário, faça:
if [ -t 0 ]; then
read -t 3
else
sleep 3
fi
[ -t n ]testa se o descritor de arquivo n (0 sendo stdin) se refere a um dispositivo terminal.
Você poderia fazer, read -t 3 < /dev/ttymas isso anularia o propósito de nohupadicionar de volta a interação com o terminal contra o qual nohupse deve proteger.
read -t 3
(umaksh93
extensão agora também suportada porzsh
,bash
emksh
) destina-se a ler uma linha ( a linha lógica nessas linhas pode ser continuada com uma barra invertida à direita, pois você não usa a-r
opção) de stdin para$REPLY
um tempo limite de 3 segundos.Se stdin for um terminal, ele ficará inativo por 3 segundos, a menos que o usuário pressione enter (e o script será suspenso com um sinal SIGTTIN se for iniciado em segundo plano).
Se for um arquivo normal, ele lerá essa linha e retornará imediatamente. Se for
/dev/zero
, fará uma leitura muito ocupada de gigabytes de zeros a partir daí, etc.nohup
é o comando que você usa para desanexar um comando de um terminal. Ele redireciona stdin para/dev/null
e stdout e stderr paranohup.out
. Portanto, normalmente você não gostaria de ler do terminal nesse caso.read
em/dev/null
retorna imediatamente sem nenhum dado retornado,/dev/null
é para isso que serve.Se o objetivo do uso
read -t
é ter um tipo de sono que pode ser interrompido pelo usuário (pressionando Enter) como quando você deseja dar a ele tempo para ler uma mensagem que ele pode pular,read -t
retornando imediatamente quando não interativo (como quando executado sobnohup
) pareceria a coisa certa a fazer, pois não há motivo para atrasar o script.Mas se você quiser ler do terminal com tempo limite se stdin for um terminal e dormir caso contrário, faça:
[ -t n ]
testa se o descritor de arquivo n (0 sendo stdin) se refere a um dispositivo terminal.Você poderia fazer,
read -t 3 < /dev/tty
mas isso anularia o propósito denohup
adicionar de volta a interação com o terminal contra o qualnohup
se deve proteger.