Como eu respondo automaticamente y no script bash?

14

Eu quero desinstalar algum programa através de um script bash. Depois de executar o comando, o terminal me pergunta se tenho certeza de que quero desinstalá-lo. Então eu preciso responder y. Quero fazê-lo automaticamente e responder yapós um atraso de 10 segundos.

Eu fiz este exemplo, mas não está funcionando -

#!/usr/bin
/opt/MNG/MNGVIEWHP/fe/uninstall
sleep 10
echo "y"

Qualquer ideia? Centos 7.2

Shalev Sason
fonte
6
ITYM, em #! /bin/bash -vez de#!/usr/bin
Stéphane Chazelas 14/04/19
verifique se o uninstallprograma aceita parâmetros ou um script de configuração ou não. Será mais fácil assim
phuclv 14/04/19
1
Anúncio solicitado e respondido nauseam em toda a web. " não está funcionando" não é uma boa descrição do problema. Talvez você possa afirmar como o seu problema é diferente dos inúmeros outros.
2
O que seu script realmente faz: execute uninstalle aguarde até que ele saia. Então durma 10 segundos. Em seguida, o eco y\nna saída padrão (que ainda está ligado ao terminal, não a entrada padrão de qualquer programa)
Pedro Cordes

Respostas:

46

É para isso que yesserve o comando. Ele gera ys um por linha indefinidamente, para que possa ser canalizado para comandos que fazem perguntas sim / não.

yes | /opt/MNG/MNGVIEWHP/fe/uninstall

Isso responde ya todas as perguntas. Para responder na todas as perguntas, substitua yespor yes n. Para uma mistura predefinida de ye n, você pode substituir yespor:

printf '%s\n' y n n y y n...

Ou execute-o como:

/opt/MNG/MNGVIEWHP/fe/uninstall << 'EOF'
y
n
n
y
y
n
EOF

Se você precisar que a resposta não esteja disponível para leitura antes de 10 segundos, faça:

(sleep 10; echo y; sleep 2; echo n;...) | /opt/MNG/MNGVIEWHP/fe/uninstall

Mas isso provavelmente não seria necessário, quando escrevermos yno canal, ele estará lá para uninstalllê-lo sempre que quiser, é improvável que você precise esperar que esteja pronto para lê-lo. A exceção seria se você uninstalldecidir liberar a entrada antes de fazer a pergunta.

Todos assumem que o uninstallcomando apenas lê cada resposta como uma linha de entrada de sua entrada padrão.

Para casos mais complexos, onde o comando lê as respostas diretamente do dispositivo tty ou onde você precisa de respostas de alimentação condicionalmente (por exemplo, com base no que as saídas de comando), que é onde você pode usar coisas como expectou zsh's zpty.

Observe que muitos programas interativos podem entrar em algum modo não interativo quando passam por alguma opção. Convém verificar o manual primeiro, antes de gastar muito esforço para solucionar o problema.

Stéphane Chazelas
fonte
Obrigado! Isso é bom caso precisemos responder apenas a uma pergunta. O que aconteceu se tivermos que responder em 20 perguntas, por exemplo?
precisa saber é o seguinte
@ Shalev, veja editar.
Stéphane Chazelas 14/04/19
Obrigado ! Então, se eu quiser inserir outros valores como interger (2 por exemplo), preciso substituí-lo em vez de "y"? printf '% s \ n' ynnyyn 2 3 ny | / opt / MNG / MNGVIEWHP / fe / uninstall
Shalev Sason
Sim, essa é a ideia.
Stéphane Chazelas
3
@ShalevSason, em todas as soluções que dei, como echo "y"sempre, escrevemos y<newline>, simulando você pressionando yseguido de Enter. Se você deseja simular pressionando Enter sozinho, isso estaria alimentando uma linha vazia, então printf '%s\n' y n '' 2 3(onde ''está a linha vazia).
Stéphane Chazelas