Sto eseguendo uno script che richiede di inserire 'y' su ogni operazione, sto cercando una soluzione come $ ./script < echo 'yyyyyyyyyyyyyy'
per passare tutti i miei input in una volta.
Migliore risposta
C'è un comando creato appositamente per quel caso:yes
$ yes | ./script
Ciò che fa è collegare l'output di yes
all'input di ./script
. Quindi quando ./script
richiede l'input dell'utente riceverà invece l'output di yes
. L'output di yes
è un flusso infinito di y
seguito da una nuova riga. Quindi praticamente come se l'utente stesse inserendo y
per ogni domanda di ./script
.
Se vuoi dire di no (n
) invece di sì (y
) puoi farlo in questo modo:
$ yes n | ./script
Nota 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 quanti y
il tuo script si aspetta che tu possa farlo in questo modo:
$ printf 'ynynyn' | ./script
Le nuove righe (n
) sono i tasti di invio.
Usando printf
invece di yes
hai un controllo più dettagliato dell'input:
$ printf 'yesnnonmayben' | ./script
Si noti che in alcuni rari casi il comando non richiede all'utente di premere Invio dopo il carattere. in tal caso lascia fuori le nuove 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 here:
$ ./script <<< "y
y
y
"
Oppure puoi creare un file con un input per riga:
$ ./script < inputfile
Se il comando è sufficientemente complesso e i metodi precedenti non sono più sufficienti, puoi utilizzare attend.
Ecco un esempio di uno script di attesa super semplice:
spawn ./script
expect "are you sure?"
send "yesr"
expect "are you really sure?"
send "YES!r"
expect eof
Pignolo tecnico:
L'ipotetica chiamata al comando che hai fornito nella tua domanda non funziona:
$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory
Questo perché la grammatica della shell consente 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
verrà chiamato con l'argomento 'yyyyyyyyyyyyyy'
e lo stdin riceverà input da un file chiamato echo
. E bash si lamenta poiché il file non esiste.