GNU/Linux >> LINUX-Kenntnisse >  >> Ubuntu

Eingabe automatisch in die Befehlszeile eingeben?

Ich führe ein Skript aus, das die Eingabe von „y“ bei jeder Operation anfordert. Ich suche nach einer Lösung wie $ ./script < echo 'yyyyyyyyyyyyyy' um alle meine Eingaben auf einmal zu übergeben.

Beste Antwort

Es gibt einen speziell für diesen Fall erstellten Befehl:yes

$ yes | ./script

Was dies tut, ist die Ausgabe von yes zu verbinden zur Eingabe von ./script . Wenn also ./script nach Benutzereingaben fragt, erhält es stattdessen die Ausgabe yes . Die Ausgabe von yes ist ein endloser Strom von y gefolgt von einem Zeilenumbruch. Also im Grunde so, als würde der Benutzer y eingeben für jede Frage von ./script .

Wenn Sie nein sagen möchten (n ) statt yes (y ) kannst du es so machen:

$ yes n | ./script

Beachten Sie, dass einige Tools die Option haben, immer yes anzunehmen als Antwort. Siehe zum Beispiel hier:Bypass the yes/no prompt in ‘apt-get upgrade’

Andere Eingabemethoden:

Wenn Sie genau wissen, wie viele y Ihr Skript erwartet, dass Sie es so machen können:

$ printf 'ynynyn' | ./script

Die Zeilenumbrüche (n ) sind die Eingabetasten.

Verwenden von printf statt yes Sie haben eine feinkörnigere Kontrolle über die Eingabe:

$ printf 'yesnnonmayben' | ./script

Beachten Sie, dass der Befehl in einigen seltenen Fällen nicht erfordert, dass der Benutzer nach dem Zeichen die Eingabetaste drückt. in diesem Fall lassen Sie die Zeilenumbrüche weg:

$ printf 'yyy' | ./script

Der Vollständigkeit halber können Sie auch hier ein Dokument verwenden:

$ ./script << EOF
y
y
y
EOF

Oder wenn Ihre Shell dies unterstützt, ein Here-String:

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

Oder Sie können eine Datei mit einer Eingabe pro Zeile erstellen:

$ ./script < inputfile

Wenn der Befehl ausreichend komplex ist und die obigen Methoden nicht mehr ausreichen, können Sie Expect.

verwenden

Hier ist ein Beispiel für ein supereinfaches Expect-Skript:

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

Technischer Nitpick:

Der hypothetische Befehlsaufruf, den Sie in Ihrer Frage angegeben haben, funktioniert nicht:

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

Dies liegt daran, dass die Shell-Grammatik überall in der Befehlszeile einen Umleitungsoperator zulässt. Soweit es die Shell betrifft, ist Ihre hypothetische Befehlszeile dieselbe wie diese Zeile:

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

Das bedeutet ./script wird mit dem Argument 'yyyyyyyyyyyyyy' aufgerufen und die Standardeingabe erhält Eingaben aus einer Datei namens echo . Und bash beschwert sich, da die Datei nicht existiert.

Verwandte:Wie debuggt man Suspend in Ubuntu?
Ubuntu
  1. Zugriff auf die Zwischenablage über die Befehlszeile?

  2. Was macht die Zeile '!/bin/sh -e'?

  3. ./configure :/bin/sh^M :schlechter Interpreter

  4. Wann sollte ich /dev/shm/ verwenden und wann sollte ich /tmp/?

  5. die Verwendung von < /dev/null &in der Kommandozeile

Finden Sie den geografischen Standort des Ubuntu-Servers über die Befehlszeile

Befehlszeilen-Audioplayer?

Finden Sie die Befehlszeile?

Thunar-Befehlszeilenoptionen?

6 Beispiele für Script-Befehlszeilenargumente

matlab Skript von der Linux-Befehlszeile ausführen