Vraag Voer automatisch invoer in op de opdrachtregel


Ik voer een script uit dat vraagt ​​om 'y' in te geven bij elke bewerking, ik ben op zoek naar een oplossing zoals $ ./script < echo 'yyyyyyyyyyyyyy' om al mijn invoer in één keer door te geven.


95
2017-08-29 12:05


oorsprong


Soms -f optie werkt goed met bepaalde opdrachten. - iammilind


antwoorden:


Er is een commando speciaal gemaakt voor die case: yes

$ yes | ./script

Wat dit doet is de ingang van verbinden ./script naar de uitgang van yes. Dus wanneer ./script vraagt ​​om gebruikersinvoer maar krijgt de uitvoer van yes. De uitvoer van yes is een eindeloze stroom van y gevolgd door een nieuwe regel. Dus eigenlijk alsof de gebruiker binnenkomt y voor elke vraag van ./script.

Als je nee wilt zeggen (n) in plaats van ja (y) je kunt het als volgt doen:

$ yes n | ./script

Merk op dat sommige hulpmiddelen een optie bieden om niet te vragen en altijd te nemen yes als antwoord. Zie hier bijvoorbeeld: Omzeil de ja / nee-prompt in 'apt-get-upgrade'


Andere methoden om invoer in te voeren:

Als je precies weet hoeveel y je script verwacht dat je het als volgt kunt doen:

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

De nieuwe regels (\n) zijn de enter-toetsen.

Gebruik makend van printf in plaats van yes je hebt meer fijnmazige controle over de invoer:

$ printf 'yes\nno\nmaybe\n' | ./script

Merk op dat in sommige zeldzame gevallen de opdracht niet vereist dat de gebruiker op Enter drukt na het teken. laat in dat geval de nieuwe regels weg:

$ printf 'yyy' | ./script

Voor de volledigheid kunt u ook een hier document:

$ ./script << EOF
y
y
y
EOF

Of als uw shell dit ondersteunt hier string:

$ ./script <<< "y
y
y
"

Of u kunt een bestand met één invoer per regel maken:

$ ./script < inputfile

Als de opdracht voldoende complex is en de bovenstaande methoden niet langer volstaan, kunt u gebruiken verwachten.

Hier is een voorbeeld van een supereenvoudig verwacht script:

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

Technische nitpick:

De hypothetische opdrachtaanroep die u in uw vraag hebt gegeven, werkt niet:

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

Dit komt omdat de shell-grammatica een redirect-operator overal in de opdrachtregel toestaat. Wat de shell betreft, is uw hypothetische opdrachtregel gelijk aan deze regel:

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

Dat betekent ./script wordt aangeroepen met het argument 'yyyyyyyyyyyyyy' en de stdin krijgt invoer van een bestand met de naam echo. En bash klaagt omdat het bestand niet bestaat.


182
2017-08-29 12:08



Dat is best wel cool! - Oli♦
Ik wou dat ik je meer dan één upvote kon geven :) - Jan Warchoł
je redde de hel veel tijd !!! Bedankt! - Akshay Shah
ik krijg een cannot enable tty mode on non tty input. Zou je hier een oplossing voor weten? - bmpasini
Wanneer ik het probeer printf trick met a run bestand dat ik nodig heb om het installatieproces te automatiseren van, alles wat er gebeurt, krijg ik een foutmelding Warning: Tried to connect to session manager, None of the authentication protocols specified are supporteden het script wordt geopend in een nieuwe terminal en wordt gevraagd om mijn invoer handmatig in te voeren. Dit gebeurt overigens op Debian. Suggesties? - DavidB


Sommige dingen (apt-get bijvoorbeeld) accepteren speciale vlaggen om in de stille modus te werken (en standaardwaarden te accepteren). In apt-gethet geval, je geeft het gewoon een -y vlag. Dit is echter volledig afhankelijk van je script.

Als u ingewikkeldere dingen wilt, kunt u uw script in een verwacht script plaatsen. verwachten dat je output kunt lezen en input kunt verzenden, zodat je behoorlijk gecompliceerde dingen kunt doen die andere scripting niet toestaat. hier is een van de voorbeelden van zijn Wikipedia-pagina:

# 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

6
2017-08-29 12:12





In het shell-script kun je ook de volgende trick of spawn gebruiken, verwachten en verzenden

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

In de bovenstaande scenerio moet je echter de zin geven die je verwacht te krijgen terwijl je het script uitvoert voor meer voorbeelden ga naar de volgende link

Verwacht binnen Bash


5
2017-08-29 12:35





Gebruik de opdracht yes:

yes | script

Fragment van de manpagina:

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'.

5
2018-04-11 14:40





Oké, dit is misschien geen erg elegante oplossing, maar als je je opties in een apart bestand schrijft en het vervolgens als invoer voor het script doorgeeft, zou het ook werken. Dus als je een nieuw bestand maakt met al je opties (noem dit bestand als 'options.in'), dan kun je eenvoudig je script uitvoeren met ./script.sh < options.inen bewerk / creëer verschillende optiebestanden zoals geschikt.


1
2017-08-29 15:50





Ik schreef een bash-script met Dialog en moest dit ook automatisch laten gebeuren. Ik deed dit en het werkte als een charme.

# -Wy force signaturewipe (if exists)
echo "y" | sudo lvcreate -W y -n $lvName -L "$lvSize"G /dev/"$svg" >> $nfsUtilLog

0
2017-08-03 16:05





U kunt gebruikersinvoer naar uw script leveren met cat, uit een tekstbestand, doorgestuurd naar je script met bash soortgelijk:

cat input.txt | bash your_script.sh

Plaats gewoon de door u gewenste gebruikersinvoer in uw input.txt bestand, welke antwoorden u ook wenst - y, n, cijfers, strings, etc.


-3
2017-07-05 09:46



aka askubuntu.com/a/338955/158442 - muru
@muru Voor mij werkte de oplossing die je hebt genoemd niet, dus ik moet mijn oplossing uitvinden. - WebComer
Onwaarschijnlijk. Beiden beschrijven hetzelfde. - muru
@muru Gelijk idee van aanbodantwoorden uit bestand (wat op verschillende manieren kan worden gedaan) is niet hetzelfde, en bovendien heeft het op een heel andere manier plaatsgevonden. Je zou het moeten kunnen zien. Als de oplossing die u aangeeft voor mij zou werken, zal ik mijn tijd niet besteden aan het opnieuw uitvinden van het wiel vandaag. U mag welk werk dan ook voor u gebruiken. - WebComer
@muru Ik geloof dat er een verschil is tussen de twee, waarvan sommige in de antwoorden worden beschreven askubuntu.com/questions/172982/.... Voor mij is bijvoorbeeld mijn code als de uitvoer wordt omgeleid naar het bestand, meer duidelijk als een natuurlijke stroom van links naar rechts. Het down-voting van goed werkende oplossingen zoals jij stimuleert immers mensen niet om hun oplossingen hier te delen. Ik geloof dat dat genoeg is om downvoting te verwijderen. - WebComer