Jeg kjører et skript som det ber om å legge inn ' y ' på hver operasjon, jeg leter etter en løsning som $ ./script < echo ' yyyyyyyyyyyy '
for å sende alle inngangene mine på en gang.
Det er en kommando som er opprettet spesielt for det tilfellet: ja
$ yes | ./script
Dette kobler utdataene fra yes
til inndataene fra ./script
. Så når ./script
ber om brukerinput vil den i stedet få output av yes
. Resultatet av yes
er en endeløs strøm av y
etterfulgt av en ny linje. Så i utgangspunktet er det som om brukeren skriver inn y
for hvert spørsmål med ./script
.
Hvis du vil si nei (n
) i stedet for ja (y
), kan du gjøre det slik:
$ yes n | ./script
Merk at noen verktøy har et alternativ for alltid å anta ja
som svar. Se for eksempel her: https://askubuntu.com/questions/118025/bypass-the-yes-no-prompt-in-apt-get-upgrade
Andre metoder for å legge inn input:
Hvis du vet nøyaktig hvor mange y
skriptet ditt forventer, kan du gjøre det slik:
$ printf 'y\ny\ny\n' | ./script
De nye linjene (\n
) er enter-tastene.
Ved å bruke printf
i stedet for yes
har du mer finkornet kontroll over inndata:
$ printf 'yes\nno\nmaybe\n' | ./script
Legg merke til at kommandoen i noen sjeldne tilfeller ikke krever at brukeren trykker enter etter tegnet. i så fall utelater du newlines:
$ printf 'yyy' | ./script
For fullstendighetens skyld kan du også bruke et her-dokument:
$ ./script << EOF
y
y
y
EOF
Eller hvis skallet ditt støtter det, en her-streng:
$ ./script <<< "y
y
y
"
Eller du kan opprette en fil med én input per linje:
$ ./script < inputfile
Hvis kommandoen er tilstrekkelig kompleks og metodene ovenfor ikke lenger er tilstrekkelige, kan du bruke expect.
Her er et eksempel på et superenkelt expect-skript:
spawn ./script
expect "are you sure?"
send "yes\r"
expect "are you really sure?"
send "YES!\r"
expect eof
Teknisk flisespikkeri:
Den hypotetiske kommandoen du ga i spørsmålet ditt, fungerer ikke:
$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory
Dette er fordi skallgrammatikken tillater en omdirigeringsoperator hvor som helst i kommandolinjen. Når det gjelder skallet, er din hypotetiske kommandolinje den samme som denne linjen:
$ ./script 'yyyyyyyyyyyyyy' < echo
bash: echo: No such file or directory
Det betyr at ./script
vil bli kalt med argumentet 'yyyyyyyyyyyyyy'
og stdin vil få input fra en fil med navnet echo
. Og bash klager siden filen ikke eksisterer.
Noen ting (apt-get
for eksempel) aksepterer spesielle flagg for å kjøre i stille modus (og aksepterer standardverdier). I apt-get
s tilfelle, du bare sende det en -y
flagg. Dette avhenger imidlertid helt av skriptet ditt.
Hvis du trenger mer kompliserte ting, kan du pakke inn skriptet ditt i et forventet skript. expect lar deg lese utdata og sende input slik at du kan gjøre ganske kompliserte ting som andre skript ikke ville tillate. Her er et av eksemplene fra Wikipedia-siden:
# 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
I shell-skriptet kan du også bruke følgende triks for å gyte, forvente og sende
spawn script.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"
Men i scenariet ovenfor må du gi uttrykket du forventer å få mens du kjører skriptet for flere eksempler, gå til følgende lenke