O 'read' embutido trava indefinidamente quando usado com 'timeout'

1

O script abaixo funciona perfeitamente com bash , mas não com sudo bash ou sh . Pressionar enter ou ^C não funcionará. Apenas ^\ e ^Z funcionam, mas não com sudo bash .

printf '#!/bin/sh\nread var\n' > myscript
chmod +x myscript
sh -c "timeout -k 1 10 ./myscript"
# it does work when 'bash' is used instead of 'sh'

Eu sei que posso usar read -t 10 . (Isso não está disponível em sh e funciona somente se eu parar de usar timeout mesmo assim.) Mas a razão pela qual eu estou usando timeout não tem nada a ver com read . Eu preciso disso para (outras coisas em) myscript . Eu não preciso de uma solução alternativa, mas uma explicação para a coisa bash / sudo bash e esperançosamente uma solução para timeout e read .

    
por argle 21.03.2018 / 10:09

1 resposta

0

Eu ainda não sei porque isso é assim, mas tem algo a ver com a forma como diferentes shells executam e tratam os sinais. Aparentemente, parece que esta é alguma solução:

sh -c "timeout --foreground -k 1 5 ./myscript"

O mesmo com sudo bash :

sudo bash -c "timeout --foreground -k 1 5 ./myscript"

man timeout explica isso:

--foreground

       when not running timeout directly from a shell prompt,

       allow COMMAND to read from the TTY and get TTY signals; in  this
       mode, children of COMMAND will not be timed out

Não tenho certeza do que isso significa, nem quais são as consequências, mas talvez isso ajude você ou outra pessoa a explicar.

    
por 21.03.2018 / 10:40