Como crio uma resposta “sim” para instalar programas?

113

Trabalho com instâncias do Amazon Linux e tenho alguns scripts para preencher os dados e instalar todos os programas com os quais trabalho, mas alguns dos programas pedem:

Do you want to continue [Y/n]?

e pause a instalação. Desejo responder automaticamente "Y" em todos os casos, mas agora tenho certeza de como fazer isso.

usuário974887
fonte
3
O gerenciador de pacotes pode ter um sinalizador --nopromptou que --noconfirmvocê pode usar.
Blender

Respostas:

209

O comando 'sim' irá ecoar 'y' (ou o que você pedir) indefinidamente. Use-o como:

yes | command-that-asks-for-input

ou, se um 'Y' maiúsculo for necessário:

yes Y | command-that-asks-for-input
PT
fonte
isso só funciona com algum comando com suporte para usar a entrada sim, não é? Eu tentei com o olhar do OpenStack e não funcionou, acho que o Expect é mais preciso para todas as circunstâncias
HVNSweeting 01 de
1
//, E se você tiver que inserir a palavra completa "sim"?
Nathan Basanese
1
Tenha cuidado yescomo é conhecido para maximizar a CPU. stackoverflow.com/a/18164007/720665
David Salamon
Agradável. Isso apenas tornou minha vida substancialmente mais fácil. : D. Também pesquisar -ypor scripts bash foi DIFÍCIL.
Nathan Smith
1
@DavidSalamon esse é apenas o caso quando ele está gravando em algo sem limite, como /dev/nullou STDOUT. Canalizado para um comando, ele gravará apenas uma linha no canal cada vez que o comando de recebimento ler uma e, caso contrário, esperará.
Walf
68

echo y | command Deveria trabalhar.

Além disso, alguns instaladores têm um sinalizador "auto-sim". É -ypara apt-getno Ubuntu.

Dennis
fonte
Estou tentando fazer echo "giturl no" | registro jspm criar nome_do_registro jspm-git em meu script de shell. mas continua falhando. ao entrar no giurl. Qualquer ideia?
manismku
Outro exemplo: em docker-compose há sinalizador -f( --force) que funciona como "auto-sim" para comandos que removem algo
luke
Como você "ecoa Y" recursivamente no caso de o prompt solicitar uma confirmação mais de uma vez?
Safak Ozkan de
18

Você pode não conseguir instalar o Expect no servidor de destino. Este é frequentemente o caso quando se escreve, digamos, um trabalho do Jenkins.

Se sim, eu consideraria algo como a resposta ao seguinte em askubuntu.com:

/ubuntu/338857/automatically-enter-input-in-command-line

printf 'y\nyes\nno\nmaybe\n' | ./script_that_needs_user_input

Observe que, em alguns casos raros, o comando não exige que o usuário pressione Enter após o caractere. nesse caso, deixe as novas linhas de fora:

printf 'yyy' | ./script_that_needs_user_input

Para fins de integridade, você também pode usar um documento aqui:

./script_that_needs_user_input << EOF
y
y
y
EOF

Ou se seu shell suporta uma string here:

./script <<< "y
y
y
"

Ou você pode criar um arquivo com uma entrada por linha:

./script < inputfile

Novamente, todo o crédito por esta resposta vai para o autor da resposta em askubuntu.com , lesmana.

Nathan Basanese
fonte
//, Por favor, certifique-se de votar a favor do usuário askubuntu.com @lesmana se você gostou desta resposta.
Nathan Basanese de
6

Embora isso possa ser mais complicado / pesado do que você deseja, uma maneira muito flexível de fazer isso é usando algo como Expect (ou um dos derivados em outra linguagem de programação).

Expect é uma linguagem projetada especificamente para controlar aplicativos baseados em texto, que é exatamente o que você está procurando fazer. Se você acabar precisando fazer algo mais complicado (como com lógica para realmente decidir o que fazer / responder a seguir), a expectativa é o caminho a percorrer.

Adam Batkin
fonte
6

Você só precisa colocar -ycom o comando install.

Por exemplo: yum install <package_to_install> -y

Rohan Seth
fonte
3

Se você deseja apenas aceitar os padrões, pode usar:

\n | ./shell_being_run
Warhansen
fonte
//, Como isso significa que você aceitaria padrões?
Nathan Basanese de
2
Em bash, she na maioria dos sistemas, que eu conheço, você precisa echodo \ncaso contrário, não seria canalizado para o próximo comando.
2i3r