Der Befehl „yes“ mag auf den ersten Blick trivial erscheinen, doch dieses Tutorial beleuchtet seine praktischen Anwendungen und zeigt, wie man seine kontinuierliche Positivität unter Linux und macOS nutzen kann.
Der Befehl „yes“
„yes“ ist ein äußerst einfacher Befehl in Linux und anderen Unix-artigen Systemen wie macOS. Die Einfachheit erstreckt sich sowohl auf seine Nutzung als auch auf seine ursprüngliche Implementierung. Der Quellcode der Originalversion, die von Ken Thompson für System 7 Unix geschrieben wurde, besteht lediglich aus sechs Codezeilen.
Lassen Sie sich jedoch nicht von seiner Kürze täuschen, denn dieser kleine Befehl kann auf vielfältige und nützliche Weise eingesetzt werden.
Was bewirkt „yes“?
Wird „yes“ ohne zusätzliche Parameter verwendet, verhält es sich, als würde man ununterbrochen „y“ eingeben und die Eingabetaste drücken. Und zwar sehr schnell. Dies setzt sich fort, bis man den Prozess durch Drücken von Strg + C abbricht.
yes
Tatsächlich kann „yes“ verwendet werden, um beliebige Nachrichten wiederholt auszugeben. Man gibt einfach „yes“, ein Leerzeichen und die gewünschte Zeichenkette ein und bestätigt mit der Eingabetaste. Oft wird dies genutzt, um einen Strom von „yes“- oder „no“-Ausgaben zu erzeugen.
yes yes
yes beliebiger Text
Wozu ist das gut?
Die Ausgabe von „yes“ kann in andere Programme oder Skripte umgeleitet werden.
Kennen Sie das? Sie starten einen zeitaufwendigen Prozess und lassen ihn unbeaufsichtigt laufen. Wenn Sie zurückkommen, ist der Prozess noch nicht abgeschlossen, weil er in Ihrer Abwesenheit eine Frage gestellt hat und nun auf eine Antwort (z.B. „Ja“ oder „Nein“) wartet.
Wenn Sie von vornherein wissen, dass alle Antworten positiv („ja“ oder „j“) oder negativ („nein“ oder „n“) ausfallen sollen, können Sie diese Antworten durch „yes“ bereitstellen lassen. So läuft der Prozess ohne weitere Interaktion bis zum Ende durch, wobei „yes“ alle notwendigen Antworten liefert.
„yes“ in Skripten verwenden
Betrachten Sie das folgende Bash-Shell-Skript: (Wir nehmen an, dass dies Teil eines deutlich umfangreicheren Skripts ist, dessen Ausführung einige Zeit in Anspruch nimmt.)
#!/bin/bash # ... # in der Mitte eines langen Skripts # eine Eingabe vom Benutzer einholen # ... echo "Möchten Sie fortfahren? [j,n]" read input # wurde etwas eingegeben? if [ "$input" == "" ]; then echo "Es wurde keine Eingabe vom Benutzer erkannt" # war die Eingabe ein 'y' oder 'yes'? elif [[ "$input" == "y" ]] || [[ "$input" == "yes" ]]; then echo "Positive Antwort: $input" # alles andere wird als negative Antwort gewertet else echo "Negative Antwort: $input" fi
Dieses Skript stellt eine Frage und wartet auf eine Antwort. Der weitere Ablauf des Skripts hängt von der Benutzereingabe ab.
Ein „ja“ oder „j“ wird als positive Antwort interpretiert. Jede andere Eingabe wird als negative Antwort gewertet. Das Drücken der Eingabetaste ohne Text bewirkt nichts.
Um dies zu testen, speichern Sie das Skript in einer Datei namens `long_script.sh` und machen es mit `chmod` ausführbar:
chmod +x long_script.sh
Führen Sie das Skript nun aus und geben Sie verschiedene Eingaben wie „ja“, „j“ oder beliebigen anderen Text ein, oder drücken Sie einfach die Eingabetaste.
./long_script.sh
Um die Antwort auf die Frage des Skripts automatisch mit „yes“ zu beantworten, leiten Sie die Ausgabe von „yes“ an das Skript weiter:
yes | ./long_script.sh
Einige Skripte sind strenger und akzeptieren nur das vollständige Wort „ja“ als positive Antwort. Dies kann erreicht werden, indem man „yes“ als Parameter für „yes“ angibt:
yes yes | ./long_script.sh
Sorgfältiger Umgang mit „yes“
Sie sollten sicherstellen, dass die Eingaben, die Sie an Skripte oder Programme weiterleiten, auch wirklich das gewünschte Ergebnis liefern. Um diese Entscheidung treffen zu können, ist es unerlässlich, die gestellten Fragen und die möglichen Antworten zu verstehen.
Die Logik in einem Skript, Befehl oder Programm kann von Ihren Erwartungen abweichen. In unserem Beispiel hätte die Frage auch lauten können: „Möchten Sie abbrechen? [j,n]“. In diesem Fall würde eine negative Antwort die Fortsetzung des Skripts ermöglichen.
Sie sollten mit dem Skript, Befehl oder Programm vertraut sein, bevor Sie „yes“ unbedacht einsetzen.
„yes“ mit Befehlen verwenden
In der Anfangszeit wurde „yes“ häufig in Kombination mit anderen Linux-Befehlen genutzt. Mittlerweile sind die meisten dieser Befehle jedoch so konzipiert, dass sie ohne Benutzerinteraktion auskommen. Daher wird „yes“ in diesen Fällen seltener benötigt.
Nehmen wir als Beispiel den Ubuntu-Paketmanager `apt-get`. Früher nutzte man `yes`, um eine Anwendung zu installieren, ohne während der Installation wiederholt „y“ bestätigen zu müssen:
yes | sudo apt-get install fortune-mod
Das gleiche Ergebnis lässt sich jedoch einfacher mit der Option `-y` (für „yes“) in `apt-get` erzielen:
sudo apt-get -y install fortune-mod
Sie werden feststellen, dass `apt-get` nun nicht einmal mehr die übliche Frage „Möchten Sie fortfahren? [J/n]“ stellt. Stattdessen wird einfach angenommen, dass die Antwort „Ja“ lautet.
Bei anderen Linux-Distributionen ist die Situation ähnlich. Unter Fedora wurde früher folgender Befehl verwendet:
yes | yum install fortune-mod
Der `dnf`-Paketmanager hat `yum` ersetzt, und auch `dnf` verfügt über die Option `-y` (für „Ja“).
dnf -y install fortune-mod
Gleiches gilt für Befehle wie `cp`, `fsck` und `rm`. Diese Befehle haben jeweils ihre eigenen Optionen `-f` (force) oder `-y` (angenommen Ja).
Scheint es also, dass die Nutzung von „yes“ hauptsächlich auf Skripte beschränkt ist? Nicht ganz, es gibt noch ein paar weitere Anwendungsmöglichkeiten.
Weitere Tricks mit „yes“
In Kombination mit einer Zahlenfolge, die mit `seq` generiert wird, kann „yes“ genutzt werden, um wiederholte Aktionen in einer Schleife zu steuern.
Dieser Einzeiler sendet die generierten Zahlen an das Terminalfenster und pausiert dann für eine Sekunde.
Anstatt die Zahlen direkt in das Terminalfenster auszugeben, kann man sie auch nutzen, um einen anderen Befehl oder ein Skript aufzurufen. Das Skript oder der Befehl muss die Zahlen nicht einmal verwenden. Sie dienen hier lediglich dazu, jeden Schleifendurchlauf zu starten.
yes "$(seq 1 20)" | while read digit; do echo digit; sleep 1; done
Manchmal ist es nützlich, eine große Datei zum Testen zu haben, sei es um die Funktionalität des Zip-Befehls zu testen, oder um eine umfangreiche Datei für FTP-Uploads zu haben.
Mit „yes“ lassen sich schnell große Dateien generieren. Geben Sie einfach eine lange Textzeichenkette an und leiten Sie die Ausgabe in eine Datei um. Achtung: Diese Dateien wachsen sehr schnell. Seien Sie bereit, innerhalb weniger Sekunden Strg+C zu drücken.
yes langer sinnloser Text für Datei-Padding > test.txt
ls -lh test.txt
wc test.txt
Die hier generierte Datei erreichte auf dem Testrechner innerhalb von etwa fünf Sekunden eine Größe von 557 MB und enthielt 12,4 Millionen Zeilen, wie `wc` berichtet.
Die Dateigröße lässt sich begrenzen, indem man `head` in den Befehl einfügt. Dadurch kann die Anzahl der Zeilen in der Datei begrenzt werden. `-50` bedeutet beispielsweise, dass `head` nur 50 Zeilen in die Datei `test.txt` schreibt.
yes langer sinnloser Text für Datei-Padding | head -50 > test.txt
Sobald die Datei `test.txt` 50 Zeilen enthält, wird der Prozess automatisch beendet, ohne dass Strg+C erforderlich ist. Das Programm stoppt sauber von selbst.
`wc` meldet, dass die Datei genau 50 Zeilen, 400 Wörter und 2350 Bytes enthält.
Auch wenn der Befehl „yes“ immer noch nützlich ist, um Eingaben in langlaufende Skripte zu lenken (und ein paar weitere Tricks), wird er wahrscheinlich nicht zu Ihrem täglichen Werkzeug gehören. Wenn Sie ihn jedoch benötigen, werden Sie feststellen, dass er einfach ist – und das alles mit nur sechs Codezeilen.