Fai in modo che lo script bash risponda ai prompt interattivi [duplicato]


109

È possibile che uno script bash gestisca automaticamente i prompt che normalmente sarebbero presentati all'utente con azioni predefinite? Attualmente sto utilizzando uno script bash per chiamare uno strumento interno che mostrerà all'utente (chiedendo S / N) di completare le azioni, tuttavia lo script che sto scrivendo deve essere completamente "senza mani", quindi Ho bisogno di un modo per inviare Y|Nal prompt per consentire al programma di continuare l'esecuzione. È possibile?


questo non è "completamento automatico" ... come dice @unwind, è "automazione"
benzaita

3
Esempio di utilizzo yesper fare questo: unix.stackexchange.com/questions/47344/…
Droogans

Risposte:


65

Questo non è "completamento automatico", questa è automazione. Uno strumento comune per queste cose si chiama Expect .

Potresti anche farla franca solo con l'input di tubazioni da yes.


3
Sfortunatamente non posso usarlo perché i requisiti di spazio sul sistema che lo esegue sono rigorosi, quindi non posso aggiungere pacchetti extra, ma il collegamento ha yesfatto il trucco, fortunatamente tutti i prompt richiedevano comunque solo una "y". Grazie.
TJ L

Tuttavia Yes | commandpotrebbe non funzionare sempre. Se è solo per scopi di installazione, allora mi sono -yimbattuto in un'opzione migliore e preferita.
Umesh Kaushik

169

Un semplice

echo "Y Y N N Y N Y Y N" | ./your_script

Ciò ti consente di passare qualsiasi sequenza di "Y" o "N" al tuo script.


3
Se avessi avuto bisogno di inviare qualsiasi N, avrei usato questo metodo, ma avevo solo bisogno di Y quindi sono andato con yes. Peccato che non possa accettare due risposte, dato che sono entrambe corrette.
TJ L

3
;) Beh, se mai dovessi aver bisogno di inviarne alcuni N, ora hai un buon modo per farlo.
Loïc Février,

2
Questo non funziona per me; gli spazi non contano come nuove righe --- se per esempio echo "Y N" allora dà la stringa "Y N"come input al primo prompt e si blocca sul secondo prompt in attesa che lo completi. Ho provato a cambiare gli spazi in nuove righe, ma non ha funzionato neanche, dato ancora una stringa letterale al prompt.
temporary_user_name

52
prova a usare printf 'y\ny\ny\n' | ./your_script. In questo modo stai inserendo manualmente la nuova riga per ogni voce prevista.
Majid

8
printf '%s\n' Y Y N N Y N Y Y Ninserisce una nuova riga tra gli elementi, ma senza bisogno di una stringa di grande formato.
Charles Duffy

16

Ho trovato che il modo migliore per inviare l'input è usare cat e un file di testo per trasmettere qualsiasi input di cui hai bisogno.

cat "input.txt" | ./Script.sh

Expect non ha funzionato come previsto per me. Questa è la risposta più semplice e migliore a questa domanda.
cloudxix

12

Se devi inviare solo Y:

$> yes Y |./your_script

Se hai solo N da inviare:

$> yes N |./your_script

9

Nella mia situazione avevo bisogno di rispondere ad alcune domande senza S o N ma con testo o vuoto. Ho scoperto che il modo migliore per farlo nella mia situazione era creare un file shellscript. Nel mio caso l'ho chiamato autocomplete.sh

Avevo bisogno di rispondere ad alcune domande per un esportatore di schemi dottrine, quindi il mio file assomigliava a questo.

- Questo è solo un esempio -

php vendor/bin/mysql-workbench-schema-export mysqlworkbenchfile.mwb ./doctrine << EOF
`#Export to Doctrine Annotation Format`                                     1
`#Would you like to change the setup configuration before exporting`        y
`#Log to console`                                                           y
`#Log file`                                                                 testing.log
`#Filename [%entity%.%extension%]`
`#Indentation [4]`
`#Use tabs [no]`
`#Eol delimeter (win, unix) [win]`
`#Backup existing file [yes]`
`#Add generator info as comment [yes]`
`#Skip plural name checking [no]`
`#Use logged storage [no]`
`#Sort tables and views [yes]`
`#Export only table categorized []`
`#Enhance many to many detection [yes]`
`#Skip many to many tables [yes]`
`#Bundle namespace []`
`#Entity namespace []`
`#Repository namespace []`
`#Use automatic repository [yes]`
`#Skip column with relation [no]`
`#Related var name format [%name%%related%]`
`#Nullable attribute (auto, always) [auto]`
`#Generated value strategy (auto, identity, sequence, table, none) [auto]`
`#Default cascade (persist, remove, detach, merge, all, refresh, ) [no]`
`#Use annotation prefix [ORM\]`
`#Skip getter and setter [no]`
`#Generate entity serialization [yes]`
`#Generate extendable entity [no]`                                          y
`#Quote identifier strategy (auto, always, none) [auto]`
`#Extends class []`
`#Property typehint [no]`
EOF

La cosa che mi piace di questa strategia è che puoi commentare le tue risposte e usare EOF una riga vuota è proprio questo (la risposta predefinita). Si scopre che questo strumento di esportazione ha la sua controparte JSON per rispondere a queste domande, ma l'ho capito dopo aver fatto questo =).

per eseguire lo script è sufficiente essere nella directory desiderata ed eseguire 'sh autocomplete.sh'nel terminale.

In breve, utilizzando << EOL & EOF in combinazione con Return Lines puoi rispondere a ciascuna domanda del prompt secondo necessità. Ogni nuova riga è una nuova risposta.

Il mio esempio mostra solo come questo può essere fatto con i commenti usando anche il carattere `in modo da ricordare qual è ogni passaggio.

Nota che l'altro vantaggio di questo metodo è che puoi rispondere con più di Y o N ... in effetti puoi rispondere con spazi vuoti!

Spero che questo aiuti qualcuno.


4

C'è un'utilità incorporata speciale per questo - " ".

Per rispondere a tutte le domande con la stessa risposta, puoi correre

yes [answer] |./your_script

Oppure puoi metterlo nel tuo script per avere una risposta specifica a ogni domanda


come posso farlo all'interno dello script? intendo specificare risposte diverse per ogni domanda
Sengo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.