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.