
Benutzt du die Muschel jeden Tag? Bereit, einige logische Probleme zu lösen und etwas Neues zu lernen? Willkommen bei Katze.
Einige der hier vorgestellten Aufgaben bringen keine wirklichen Vorteile, da sie einige komplexe Grenzfälle betreffen. Der andere Teil ist nützlich für diejenigen, die ständig die Shell verwenden und die Skripte anderer lesen.
Hinweis: Zum Zeitpunkt des Schreibens verwendete der Autor bash 4.4.12 (1) -release im Linux-Subsystem unter Windows 10. Die Komplexität der Aufgaben ist unterschiedlich.
Eingabe- / Ausgabestreams
Aufgabe 1$ cat 1 The cake is a lie! Wanted! Cake or alive $ cat 1 | head | tail | sed -e 's/alive/dead/g' | tee | wc -l > 1
Wie viele Zeilen befinden sich nach dem Befehl in Datei 1?
ErklärungNach der Interpretation des Befehls, aber vor dem Ausführen aller Programme, arbeitet bash mit den angegebenen Eingabe- / Ausgabestreams. Somit wird Datei 1
gelöscht, bevor das erste Programm gestartet wird, und cat
öffnet die bereits gelöschte Datei.
Aufgabe 2 $ cat file1 I love UNIX! $ cat file2 I don't like UNIX $ cat file1 <file2
Was wird auf dem Bildschirm angezeigt?
ErklärungEinige Programme hämmern auf stdin, wenn Dateien angegeben werden.
Aufgabe 3 $ cat file Just for fun $ cat file 1>&2 2>/dev/null
Was wird auf dem Bildschirm angezeigt?
ErklärungEs besteht ein Missverständnis, dass die Sequenz
1>&2
den ersten Thread zum zweiten umleitet, dies ist jedoch nicht der Fall. Betrachten Sie das Team aus der Aufgabe. Zu Beginn der Interpretation des eingegebenen Befehls sieht die Flusstabelle folgendermaßen aus:
bash erkennt die Sequenz
1>&2
und kopiert den Inhalt von Zelle 2 in Zelle 1:
Nach dem Erkennen der Sequenz
2>/dev/null
schreibt der Interpreter den Wert in Zelle 2, wobei die anderen Zellen intakt bleiben:
0 | 1 | 2 |
stdin | stderr | / dev / null |
bash zeigt auch einen Strom von Fehlern an, so dass wir den Text der Datei auf dem Bildschirm finden.
Aufgabe 4Wie sende ich eine stdout-Ausgabe an stderr und eine stderr-Ausgabe im Gegenteil an stdout?
Die Antwort4>&1 1>&2 2>&4
ErklärungDas Prinzip ist genau das gleiche wie in der vorherigen Aufgabe. Deshalb benötigen wir einen zusätzlichen Stream für die temporäre Speicherung.
Ausführbare Dateien
Aufgabe 5Gegebene Datei test.sh
Folgende Befehle werden ausgeführt:
$ ls 1 2 3 test.sh $ ./test.sh 1 2 3
Was wird das Skript ausgeben?
Die Antwort1 2 3
1 2 3
ls: cannot access '1 2 3': No such file or directory
1 2 3
ErklärungOhne Anführungszeichen unterscheiden sich die Variablen $ * und $ @ nicht und werden in alle angegebenen Positionsargumente des Skripts erweitert, die durch ein Leerzeichen getrennt sind. In Anführungszeichen ändert sich die Offenlegungsmethode: $ * wird zu "$ 1 $ 2 $ 3" und $ @ wird wiederum zu "$ 1" "$ 2" "$ 3". Da sich die Datei „1 2 3“ nicht im Verzeichnis befindet, zeigt ls einen Fehler an
Aufgabe 6Erstellen Sie im aktuellen Verzeichnis eine
-c
Datei mit Berechtigungen von 755 und den folgenden Inhalten:
Setzen Sie die Variable $ PATH auf Null und versuchen Sie Folgendes auszuführen:
$ PATH= $ -c "echo SURPRISE"
Was wird auf dem Bildschirm angezeigt? Was passiert, wenn Sie den letzten Befehl erneut eingeben?
Die AntwortDas erste Mal wird SURPRISE
angezeigt, das zweite Mal echo SURPRISE
ErklärungWenn PATH leer ist, beginnt die Shell mit der Suche nach Dateien im aktuellen Verzeichnis. -c ist gerade gefunden. Da es sich bei der ausführbaren Datei um eine Textdatei handelt, wird die erste Zeile zum Thema Shebang gelesen. Das Team wird gemäß der Vorlage zusammengestellt:
<shebang> <filename> <args>
Daher sieht unser Befehl vor der Ausführung folgendermaßen aus:
/bin/bash -c "echo SURPRISE"
Infolgedessen ist es absolut nicht das, was wir tun wollten.
Wenn Sie es ein zweites Mal ausführen, nimmt die Shell Informationen zu -c aus dem Cache auf und führt sie bereits korrekt aus. Die einzige Möglichkeit, sich vor einem solchen unerwarteten Effekt zu schützen, besteht darin, dem Shebang zwei Minuspunkte hinzuzufügen.
Variablen
Aufgabe 7 $ ls file $ cat <$(ls) $ cat <(ls)
Was wird im ersten und zweiten Fall angezeigt?
Die AntwortDie erste zeigt den Inhalt der Datei an, die zweite den Dateinamen.
ErklärungIm ersten Fall wird die Substitution durchgeführt
cat <file
Im zweiten Fall wird
<(ls)
durch eine Named Pipe ersetzt, die durch die Eingabe mit stdout ls und die Ausgabe von stdin cat verbunden ist.
Nach dem Ersetzen hat der Befehl die Form:
cat /dev/fd/xx
Aufgabe 8 $ TEST=123456 $ echo ${TEST%56}
Was wird auf dem Bildschirm angezeigt?
ErklärungBei einem solchen Datensatz stimmt das Muster überein (# - vom Anfang der Variablen; ## - gierig vom Anfang der Variablen;% - vom Ende der Variablen; %% - gierig vom Ende der Variablen) und wird beim Ersetzen gelöscht. Der Inhalt der Variablen bleibt erhalten. So ist es beispielsweise zweckmäßig, den Dateinamen ohne die Erweiterung abzurufen.
$ TEST=file.ext $ echo ${TEST%.ext} file
Aufgabe 9 $ echo ${friendship:-magic}
Was wird auf dem Bildschirm angezeigt?
Die AntwortWenn die Freundschaftsvariable definiert ist, dann der Inhalt der Variablen. Ansonsten Magie.
ErklärungIn der Dokumentation wird diese Magie als "nicht gesetzt oder null" bezeichnet und ermöglicht es Ihnen, den angegebenen Standardwert einer Variablen in einer Zeile zu verwenden.
Ausführungsreihenfolge
Aufgabe 10 while true; false; do echo Success done
Was wird auf dem Bildschirm angezeigt?
ErklärungMit den while- und if-Anweisungen können Sie eine ganze Folge von Aktionen in die Bedingung packen, aber das Ergebnis (Rückkehrcode) wird nur im letzten Befehl berücksichtigt. Da es falsch ist, beginnt die Schleife nicht einmal.
Aufgabe 11 $ false && true || true && false && echo 1 || echo 2
Was wird auf dem Bildschirm angezeigt?
ErklärungFügen Sie Klammern für die explizite Reihenfolge hinzu und vereinfachen Sie den Befehl, wobei berücksichtigt wird, dass nur der Rückkehrcode des letzten Befehls berücksichtigt wird:
((((false && true) || true) && false) && echo 1) || echo 2 (((false || true) && false) && echo 1) || echo 2 ((true && false) && echo 1) || echo 2 (false && echo 1) || echo 2 false || echo 2 echo 2
Kommentare, Vorschläge und zusätzliche Aufgaben werden in Kommentaren oder PM begrüßt.