Preparar respostas para as perguntas de um comando

14

Digamos que eu queira escrever um shell script que execute apenas um comando. Mas este comando é mal projetado. Não oferece nenhuma opção de linha de comando; em vez disso, faz algumas perguntas e aguarda a entrada do usuário.

Existe uma maneira de preparar essa entrada no script, para que as perguntas sejam respondidas automaticamente?

tmuecksch
fonte

Respostas:

16

Se o comando não for muito exigente, ele deve funcionar com algo assim:

command > /dev/null << EOF
<answer 1>
<answer 2>
<answer 3>
EOF

Isso requer que você saiba as respostas exatas com antecedência.

Bjorn Munch
fonte
Você pode usar a resposta acima para criar um script de agrupamento. O novo script deve ouvir os parâmetros e chamar o comando antigo com o método acima.
Walter A
Também conhecido como um documento AQUI, para mais informações você pode tentar Wikipedia definição de documento aqui
Oldtimer
15

Esperar pode fazer isso. No site da Expect :

O Expect é uma ferramenta para automatizar aplicativos interativos, como telnet, ftp, passwd, fsck, rlogin, tip, etc. O Expect realmente torna esse material trivial. O esperado também é útil para testar esses mesmos aplicativos [...] "

Ele vem com muita ajuda, como a autoexpect .

Novamente no site da Expect,

O autoexpect o observa interagindo com outro programa e cria um script Expect que reproduz suas interações. Para scripts diretos, a autoexpect economiza um tempo substancial ao escrever scripts manualmente.

Christopher
fonte
Obrigado pela sua resposta. Como minhas necessidades são muito baixas, o Expect é um exagero no meu caso. A resposta dos Bjorns atende perfeitamente às minhas necessidades. Mas sugiro manter sua resposta para outras pessoas que precisam de uma solução mais complexa.
Tmuecksch
+1 porque eu não sabia que a expectativa automática existia e concluíra que a curva de aprendizado esperado era muito íngreme para eu me preocupar. Vou dar outra olhada.
Joe
7

Se o seu script espera uma resposta rápida ou várias solicitações nas quais você pode dar a mesma resposta, há yes:

NAME
       yes - output a string repeatedly until killed

SYNOPSIS
       yes [STRING]...
       yes OPTION

DESCRIPTION
       Repeatedly output a line with all specified STRING(s), or `y'.

Use-o assim:

yes Me | give_a_hug.sh
unperson325680
fonte
3
Um uso comum, embora irônico, é yes n, por exemplo:yes n | mv -i * somewhere/
Sam Watkins