Immettere automaticamente l'input nella riga di comando

106

Sto eseguendo uno script che richiede di entrare in "y" per ogni operazione, sto cercando una soluzione come $ ./script < echo 'yyyyyyyyyyyyyy' per passare tutti i miei input in una volta.

    
posta NewMrd 29.08.2013 - 14:05

7 risposte

195

Esiste un comando creato appositamente per quel caso: yes

$ yes | ./script

Ciò che fa è collegare l'input di ./script all'output di yes . 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 inserisse y per ogni domanda di ./script .

Se vuoi dire no ( n ) invece di yes ( y ) puoi farlo in questo modo:

$ yes n | ./script

Nota che alcuni strumenti offrono un'opzione per non chiedere e sempre asume yes come risposta. Vedi qui per esempio: Ignora il prompt si / no in 'apt -get upgrade '

Altri metodi per inserire l'input:

Se conosci esattamente il% di% di co_de previsto dal tuo script, puoi farlo in questo modo:

$ printf 'y\ny\ny\n' | ./script

Le nuove righe ( y ) sono le chiavi di inserimento.

Usando \n invece di printf 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, lascia fuori le nuove righe:

$ printf 'yyy' | ./script

Per completezza puoi anche utilizzare 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, puoi utilizzare aspettare .

Ecco un esempio di uno script di previsione super semplice:

spawn ./script
expect "are you sure?"
send "yes\r"
expect "are you really sure?"
send "YES!\r"
expect eof

Nitidezza tecnica:

L'ipotetica invocazione di comando che hai dato nella 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 ovunque nella riga di comando. Per quanto riguarda la shell, la tua ipotetica linea di comando è la stessa di questa linea:

$ ./script 'yyyyyyyyyyyyyy' < echo
bash: echo: No such file or directory

Ciò significa che yes verrà chiamato con l'argomento ./script e lo stdin riceverà l'input da un file chiamato 'yyyyyyyyyyyyyy' . E lamenta lamentarsi dal momento che il file non esiste.

    
risposta data lesmana 29.08.2013 - 14:08
7

Alcune cose ( apt-get per esempio) accettano flag speciali da eseguire in modalità silenziosa (e accettano i valori predefiniti). Nel caso di apt-get , basta passarlo a -y flag. Tuttavia, ciò dipende completamente dallo script.

Se hai bisogno di cose più complicate, puoi avvolgere il tuo script in uno script previsto. expect consente di leggere l'output e inviare l'input in modo da poter eseguire cose piuttosto complicate che altri script non consentono. Ecco uno degli esempi dalla sua pagina di 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
    
risposta data Oli 29.08.2013 - 14:12
6

Utilizza 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'.
    
risposta data Peter W. Osel 11.04.2014 - 16:40
5

Nello script della shell puoi anche usare il seguente trucco di spawn, aspettare e inviare

spawn script.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"

Tuttavia nello scenerio precedente dovrai dare la frase che ti aspetti di ottenere mentre esegui lo script per altri esempi vai al seguente link

Aspettatevi in Bash

    
risposta data Tarun 29.08.2013 - 14:35
2

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 per lo script, funzionerebbe altrettanto bene. Quindi, se crei un nuovo file con tutte le opzioni (chiama questo file come "options.in"), puoi facilmente eseguire il tuo script con ./script.sh < options.in e modificare / creare diversi file di opzioni come adatti.

    
risposta data Sidhha 29.08.2013 - 17:50
0

Stavo scrivendo uno script bash con Dialog e avevo bisogno che succedesse anche automaticamente. L'ho fatto e ha funzionato come un incantesimo.

# -Wy force signaturewipe (if exists)
echo "y" | sudo lvcreate -W y -n $lvName -L "$lvSize"G /dev/"$svg" >> $nfsUtilLog
    
risposta data Benjamin G. West 03.08.2017 - 18:05
-3

Puoi fornire input dell'utente al tuo script con cat , da un file di testo, inviato al tuo script con bash come questo:

cat input.txt | bash your_script.sh

Inserisci l'input utente desiderato nel tuo file input.txt, qualunque sia la risposta desiderata: y, n, cifre, stringhe, ecc.

    
risposta data WebComer 05.07.2018 - 11:46

Leggi altre domande sui tag