2013-01-18 15 views
52

Ho uno script di bash che utilizza il comando read per leggere gli argomenti ai comandi in modo interattivo, ad esempio sì/no opzioni. C'è un modo per chiamare questo script in uno script non interattivo che passa valori di opzioni predefiniti come argomenti?passare argomenti a un programma interattivo in modo non interattivo

Non è solo una opzione che devo passare allo script interattivo.

+2

Se sta leggendo da stdin è possibile reindirizzare l'input –

+2

Poiché questa domanda ottiene molti duplicati, è importante sottolineare che non è rilevante in quale lingua è scritto il programma interattivo. Potrebbe essere un programma C che legge input standard, o un'applicazione Erlang o altro. C'è qualcosa che viene eseguito dalla riga di comando e richiede odiosamente input interattivi e ti piacerebbe automatizzarlo. – tripleee

risposta

22

per Mor Compiti complessi sono expect (http://en.wikipedia.org/wiki/Expect). Simula fondamentalmente un utente, puoi codificare uno script come reagire a specifici output del programma e cose correlate.

Questo funziona anche in casi come ssh che vieta le password di piping ad esso.

+3

... Sebbene la soluzione corretta nel caso SSH sia passare all'autenticazione a chiave pubblica. – tripleee

11

È possibile inserire i dati in un file e ri-orientare in questo modo:

$ cat file.sh 
#!/bin/bash 

read x 
read y 
echo $x 
echo $y 

dati per lo script:

$ cat data.txt 
2 
3 

esecuzione dello script:

$ file.sh < data.txt 
2 
3 
88

Molti modi

pipe y il nostro input

echo "yes 
no 
maybe" | your_program 

reindirizzamento da un file

your_program < answers.txt 

usare un here document (questo può essere molto leggibile)

your_program << ANSWERS 
yes 
no 
maybe 
ANSWERS 

utilizzare un here string

your_program <<< $'yes\nno\nmaybe\n' 
+2

Indica che questo funziona solo se il programma legge lo standard input. Alcuni programmi fanno di tutto per leggere ad es. password interattive, anche quando l'input standard è una pipe. Per le password, questo ha senso per motivi di sicurezza; sebbene alcuni programmi interattivi siano semplicemente mal progettati. – tripleee

+0

@ tripleee Lungo le linee di ciò che hai detto, in che modo uno script legge le password che non sono influenzate da stdin? So che puoi usare 'read' per prendere lo stdin, quale funzione puoi usare per fare ciò che hai descritto? – flow2k

+0

In tal caso, è necessario verificare se il programma con cui si sta tentando di interagire abbia un modo speciale per inviare l'input (ad esempio sshpass, ssh-agent) o utilizzare l'opzione di script dell'interazione. –

3

Voglio solo aggiungere un altro modo. L'ho trovato altrove ed è abbastanza semplice. Dire che voglio passare sì per tutti i prompt alla riga di comando per un comando "execute_command", quindi mi limiterò semplicemente a farlo.

yes | execute_command 

Questo utilizzerà Sì come risposta a tutti i messaggi di conferma si/no.

Problemi correlati