Risposte:
Esiste un comando creato appositamente per quel caso: yes
$ yes | ./script
Ciò che fa è collegare l'output di yes
all'ingresso di ./script
. Quindi, quando ./script
chiede l'input dell'utente, otterrà invece l'output di yes
. L'output di yes
è un flusso infinito di y
seguito da una nuova riga. Quindi, in pratica, come se l'utente stesse entrando y
per ogni domanda ./script
.
Se vuoi dire no ( n
) invece di yes ( y
) puoi farlo in questo modo:
$ yes n | ./script
Si noti che alcuni strumenti hanno un'opzione per assumere sempre yes
come risposta. Vedi qui per esempio: ignora il prompt sì / no in 'apt-get upgrade'
Altri metodi per inserire l'input:
Se sai esattamente quanto il y
tuo script si aspetta puoi farlo in questo modo:
$ printf 'y\ny\ny\n' | ./script
Le newline ( \n
) sono le chiavi di invio.
Usando printf
invece di yes
te hai un controllo più fine dell'input:
$ printf 'yes\nno\nmaybe\n' | ./script
Si noti che in alcuni rari casi il comando non richiede all'utente di premere Invio dopo il carattere. in tal caso, lasciare fuori le righe:
$ printf 'yyy' | ./script
Per completezza puoi anche usare un documento qui :
$ ./script << 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
Se il comando è sufficientemente complesso e i metodi sopra non sono più sufficienti, è possibile utilizzare aspettarsi .
Ecco un esempio di uno script di attesa super semplice:
spawn ./script
expect "are you sure?"
send "yes\r"
expect "are you really sure?"
send "YES!\r"
expect eof
Nitpick tecnico:
L'ipotetica chiamata di comando che hai dato alla tua domanda non funziona:
$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory
Questo perché la grammatica della shell consente a un operatore di reindirizzamento in qualsiasi punto della riga di comando. Per quanto riguarda la shell, la tua ipotetica riga di comando è la stessa di questa riga:
$ ./script 'yyyyyyyyyyyyyy' < echo
bash: echo: No such file or directory
Ciò significa ./script
che verrà chiamato con l'argomento 'yyyyyyyyyyyyyy'
e lo stdin otterrà l'input da un file denominato echo
. E bash si lamenta poiché il file non esiste.
cannot enable tty mode on non tty input
. Sapresti una soluzione per questo?
printf
trucco con un run
file di cui ho bisogno per automatizzare il processo di installazione, tutto ciò che succede è che viene visualizzato un messaggio di errore Warning: Tried to connect to session manager, None of the authentication protocols specified are supported
e lo script si apre in un nuovo terminale e mi chiede di inserire manualmente il mio input come al solito. A proposito, questo sta succedendo su Debian. Eventuali suggerimenti?
Usa il comando yes
:
yes | script
Estratto dalla pagina man:
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'.
Alcune cose ( apt-get
ad esempio) accettano flag speciali per l'esecuzione in modalità silenziosa (e accettano i valori predefiniti). Nel apt-get
caso, basta passare una -y
bandiera. Questo dipende completamente dal tuo script.
Se hai bisogno di cose più complicate, puoi avvolgere il tuo script in uno script prevede. aspettarsi ti permette di leggere l'output e inviare l'input in modo da poter fare cose piuttosto complicate che altri script non permetterebbero. Ecco uno degli esempi dalla sua pagina Wikipedia :
# Assume $remote_server, $my_user_id, $my_password, and $my_command were read in earlier
# in the script.
# Open a telnet session to a remote server, and wait for a username prompt.
spawn telnet $remote_server
expect "username:"
# Send the username, and then wait for a password prompt.
send "$my_user_id\r"
expect "password:"
# Send the password, and then wait for a shell prompt.
send "$my_password\r"
expect "%"
# Send the prebuilt command, and then wait for another shell prompt.
send "$my_command\r"
expect "%"
# Capture the results of the command into a variable. This can be displayed, or written to disk.
set results $expect_out(buffer)
# Exit the telnet session, and wait for a special end-of-file character.
send "exit\r"
expect eof
.sh
script di shell, giusto? O c'è un modo?
Nello script della shell puoi anche usare il seguente trucco di spawn, aspetta e invia
spawn script.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"
Tuttavia, nello scenario sopra riportato dovrai dare la frase che ti aspetti di ottenere mentre esegui lo script per ulteriori esempi vai al seguente link
Ok, questa potrebbe non essere una soluzione molto elegante ma se scrivi le tue opzioni in un file separato e poi le passi come input allo script, funzionerebbe anche. Quindi, se crei un nuovo file con tutte le tue opzioni (chiama questo file come 'options.in'), puoi facilmente eseguire lo script con ./script.sh < options.in
e modificare / creare diversi file di opzioni come appropriato.
options.in
file? Puoi fare un esempio?
Stavo scrivendo uno script bash con Dialog e avevo bisogno che ciò avvenisse anche automaticamente. L'ho fatto e ha funzionato come un fascino.
# -Wy force signaturewipe (if exists)
echo "y" | sudo lvcreate -W y -n $lvName -L "$lvSize"G /dev/"$svg" >> $nfsUtilLog
Puoi fornire l'input dell'utente al tuo script con cat
, da un file di testo, reindirizzato al tuo script in bash
questo modo:
cat input.txt | bash your_script.sh
Basta inserire l'input dell'utente desiderato nel file input.txt, qualunque sia la risposta desiderata: y, n, cifre, stringhe, ecc.
-f
opzione funziona bene con determinati comandi.