Wie gut kennst du Bash?


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?

Die Antwort
1

Erklärung
Nach 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?

Die Antwort
I love UNIX!

Erklärung
Einige 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?

Die Antwort
Just for fun

Erklärung
Es 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:
012
stdinstdoutstderr

bash erkennt die Sequenz 1>&2 und kopiert den Inhalt von Zelle 2 in Zelle 1:
012
stdinstderrstderr

Nach dem Erkennen der Sequenz 2>/dev/null schreibt der Interpreter den Wert in Zelle 2, wobei die anderen Zellen intakt bleiben:
012
stdinstderr/ dev / null

bash zeigt auch einen Strom von Fehlern an, so dass wir den Text der Datei auf dem Bildschirm finden.

Aufgabe 4
Wie sende ich eine stdout-Ausgabe an stderr und eine stderr-Ausgabe im Gegenteil an stdout?

Die Antwort
4>&1 1>&2 2>&4

Erklärung
Das 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 5

Gegebene Datei test.sh

 #!/bin/bash ls $* ls $@ ls "$*" ls "$@" 

Folgende Befehle werden ausgeführt:

 $ ls 1 2 3 test.sh $ ./test.sh 1 2 3 

Was wird das Skript ausgeben?

Die Antwort
1 2 3
1 2 3
ls: cannot access '1 2 3': No such file or directory
1 2 3


Erklärung
Ohne 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 6

Erstellen Sie im aktuellen Verzeichnis eine -c Datei mit Berechtigungen von 755 und den folgenden Inhalten:

 #!/bin/bash echo $1 

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 Antwort
Das erste Mal wird SURPRISE angezeigt, das zweite Mal echo SURPRISE

Erklärung
Wenn 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 Antwort
Die erste zeigt den Inhalt der Datei an, die zweite den Dateinamen.

Erklärung
Im 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?

Die Antwort
1234

Erklärung
Bei 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 Antwort
Wenn die Freundschaftsvariable definiert ist, dann der Inhalt der Variablen. Ansonsten Magie.

Erklärung
In 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?

Die Antwort
Nichts

Erklärung
Mit 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?

Die Antwort
2

Erklärung
Fü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.

Source: https://habr.com/ru/post/de413935/


All Articles