Come scrivo una risposta "sì" per l'installazione dei programmi?


113

Lavoro con istanze Amazon Linux e ho un paio di script per popolare i dati e installare tutti i programmi con cui lavoro, ma un paio di programmi chiedono:

Do you want to continue [Y/n]?

e sospendi l'installazione. Voglio rispondere automaticamente "Y" in tutti i casi, solo ora sono sicuro di come farlo.


3
Il gestore di pacchetti potrebbe avere un flag --noprompto --noconfirmche puoi utilizzare.
Blender

Risposte:


209

Il comando "yes" ripeterà "y" (o qualunque cosa tu chieda) indefinitamente. Usalo come:

yes | command-that-asks-for-input

oppure, se è richiesta una "Y" maiuscola:

yes Y | command-that-asks-for-input

funziona solo con alcuni comandi supportati per utilizzare l'input da sì, non è vero? Ho provato con un'occhiata da OpenStack e questo non ha funzionato, penso che Expect sia più preciso per tutte le circostanze
HVNSweeting

1
//, Cosa succede se devi inserire la parola completa "sì"?
Nathan Basanese

1
Fai attenzione yesperché è noto per massimizzare la CPU. stackoverflow.com/a/18164007/720665
David Salamon

Bello. Questo ha solo reso la mia vita sostanzialmente più facile. : D. Anche -ycercare su Google gli script bash era DIFFICILE.
Nathan Smith

1
@DavidSalamon questo è il caso solo quando si scrive su qualcosa senza limiti, come /dev/nullo STDOUT. Collegato a un comando, scriverà solo una riga nel pipe ogni volta che il comando ricevente ne legge uno, e altrimenti attenderà.
Walf

68

echo y | command dovrebbe funzionare.

Inoltre, alcuni programmi di installazione hanno un flag "auto-yes". È -yper apt-getUbuntu.


Sto cercando di fare l'eco "giturl no" | registro jspm crea nome_registro jspm-git nel mio script di shell. ma continua a fallire. entrando nel giurl. Qualche idea?
manismku

Un altro esempio: in docker-compose c'è il flag -f( --force) che funziona come "auto-yes" per i comandi che rimuovono qualcosa
luke

Come si "echo Y" ricorsivamente nel caso in cui il prompt richieda una conferma più di una volta?
Safak Ozkan

18

Potrebbe non essere possibile installare Expect sul server di destinazione. Questo è spesso il caso quando si scrive, diciamo, un lavoro di Jenkins.

In tal caso, prenderei in considerazione qualcosa di simile alla risposta a quanto segue su askubuntu.com:

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

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

Notare che in alcuni rari casi il comando non richiede che l'utente prema Invio dopo il carattere. in tal caso lascia fuori le nuove righe:

printf 'yyy' | ./script_that_needs_user_input

Per completezza puoi anche utilizzare un documento qui:

./script_that_needs_user_input << EOF
y
y
y
EOF

O se la tua shell lo supporta una stringa qui:

./script <<< "y
y
y
"

Oppure puoi creare un file con un input per riga:

./script < inputfile

Ancora una volta, tutto il merito di questa risposta va all'autore della risposta su askubuntu.com , lesmana.


//, Assicurati di votare a favore dell'utente di askubuntu.com @lesmana se ti piace questa risposta.
Nathan Basanese,

6

Sebbene questo possa essere più complicato / più pesante di quanto desideri, un modo molto flessibile per farlo è usare qualcosa come Expect (o uno dei derivati ​​in un altro linguaggio di programmazione).

Expect è un linguaggio progettato specificamente per controllare le applicazioni basate su testo, che è esattamente ciò che stai cercando di fare. Se alla fine hai bisogno di fare qualcosa di più complicato (come con la logica per decidere effettivamente cosa fare / rispondere dopo), Expect è la strada da percorrere.


6

Hai solo bisogno di mettere -ycon il comando di installazione.

Per esempio: yum install <package_to_install> -y


3

Se vuoi accettare solo i valori predefiniti puoi usare:

\n | ./shell_being_run

//, Come significa che accetteresti i valori predefiniti?
Nathan Basanese

2
In bash, she la maggior parte del sistema, che so, è necessario echol' \naltrimenti non sarebbe in filodiffusione al comando successivo.
2i3r
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.