Acht wenig bekannte Bash-Optionen

Einige Bash-Optionen sind gut bekannt und werden häufig verwendet. Zum Beispiel schreiben viele zu Beginn ihres Skripts

set -o xtrace

für das Debugging,

set -o errexit

für den Fehlerausstieg oder

set -o errunset

für den Ausstieg, falls eine aufgerufene Variable nicht gesetzt ist.

Aber es gibt viele andere Optionen. Manchmal sind sie in den Handbüchern zu verworren beschrieben, deshalb habe ich hier einige der nützlichsten mit Erklärungen zusammengestellt.

Hinweis: Auf dem Mac kann eine ältere Version von bash (3.x statt 4.x) installiert sein, bei der nicht alle diese Optionen verfügbar sind. In diesem Fall siehe hier oder hier.

set oder shopt?

Es gibt zwei Möglichkeiten, Bash-Parameter zu setzen: aus einem Skript oder von der Kommandozeile aus. Man kann die eingebauten Befehle verwenden set und shopt. Beide ändern das Verhalten der Shell, tun im Wesentlichen dasselbe (mit unterschiedlichen Argumenten), unterscheiden sich jedoch in ihrem Ursprung. Die Parameter set werden von Parametern anderer Shells geerbt oder entlehnt, während die Parameter shopt in Bash erstellt werden.

Wenn Sie die aktuellen Optionen ansehen möchten, führen Sie aus:

$ set -o
$ shopt

Um eine Option zu aktivieren, wird die lange oder kurze Syntax verwendet: set $ set -o errunset $ set -e

Der Effekt ist derselbe.

Um eine Option zu deaktivieren, muss man ein Pluszeichen statt eines Minuszeichens setzen:

$ set +e

Lange Zeit konnte ich diese Syntax nicht merken, da die Logik nicht korrekt erscheint (Minus schaltet die Option ein, Plus - schaltet sie aus).

Zur Aktivierung und Deaktivierung von Optionen werden (logischere) Flags

Im shopt (set) und -s (unset) verwendet: -u $ shopt -s cdspell # <= on $ shopt -u cdspell # <= off

Verzeichnisänderungen

Es gibt mehrere Optionen, die Ihnen helfen, mit Verzeichnissen zu arbeiten.

1. cdspell

Mit dieser Einstellung beginnt bash, Tippfehler zu erkennen und bringt Sie in das Verzeichnis, dessen Name Sie falsch eingegeben haben.

$ shopt -s cdspell $ mkdir abcdefg $ cd abcdeg abcdefg $ cd ..

Ich habe diese Option viele Jahre genutzt, und sehr selten (vielleicht einmal im Jahr) trifft sie eine sehr merkwürdige Entscheidung. Aber an den restlichen Tagen

spart cdspell täglich Zeit. 2. autocd

Wenn Sie nicht bereit sind, sich mit der Ineffizienz mehrfacher Eingaben abzufinden,

können Sie diese Option aktivieren, um in Verzeichnis X zu wechseln, wenn der Befehl X nicht existiert. cd$ shopt -s autocd $ abcdefg $ cd ..

In Kombination mit der Autovervollständigung ermöglicht es, schnell durch Verzeichnisse zu springen:

$ ./abc[TAB][RETURN] cd -- ./abcdefg

Nennen Sie nur den Ordner nicht

rm -rf * (ja, das ist möglich). 3. direxpand

Das ist eine coole Option, die Umgebungsvariablen beim Drücken der Tabulator-Taste erweitert:

Dies ist eine coole Option, die die Umgebungsvariablen durch Drücken der Tab-Taste erweitert:

$ shopt -s direxpand
$ .\/[TAB]     # wird ersetzt durch...
$ \/vollen\/pfad\/zur\/aktuellen_arbeitsumgebung
$ ~\/[TAB]     # wird ersetzt durch...
$ \/vollen\/pfad\/zum\/home\/ordner
$ $HOME\/[TAB] #  wird ersetzt durch...
$ \/vollen\/pfad\/zum\/home\/ordner

Sauberer Ausgang

4. checkjobs

Dieses Parameter stoppt das Beenden der Sitzung, wenn im Hintergrund noch Jobs ausgeführt werden.

Stattdessen wird eine Liste der laufenden Jobs angezeigt. Wenn Sie trotzdem beenden möchten, geben Sie erneut ein exit.

$ shopt -s checkjobs
$ echo $$
68125             # <= Prozess-ID der Shell
$ sleep 999 &
$ exit
Es gibt laufende Jobs.
[1]+  Running                 sleep 999 &
$ echo $$
68125             # <= Prozess-ID der Shell bleibt gleich
$ exit
Es gibt laufende Jobs.
[1]+  Running                 sleep 999 &
$ exit
$ echo $$
$ 59316           # <= diesmal hat sich die Prozess-ID geändert

Superkräfte für die Musterersetzung

5. globstar

Diese Option gibt dir Superkräfte für die Musterersetzung! Wenn du eingibst:

$ shopt -s globstar
$ ls **

zeigt die Shell rekursiv alle Verzeichnisse und Unterverzeichnisse an.

In Verbindung mit direxpand kann man schnell alles durchsehen, was tiefer in der Hierarchie liegt:

$ shopt -s direxpand
$ ls **[TAB][TAB]
Alle 2033 Möglichkeiten anzeigen? (j oder n) 

6. extglob

Diese Option aktiviert Funktionen, die häufig mit regulären Ausdrücken assoziiert werden. Manchmal ist das sehr nützlich:

$ shopt -s extglob
$ touch afile bfile cfile
$ ls
afile bfile cfile
$ ls ?(a*|b*)
afile bfile
$ ls !(a*|b*)
cfile

Hier werden Muster in runden Klammern gesetzt und durch senkrechte Striche getrennt. Hier sind die verfügbaren Operatoren:

? = соответствует нулю или одному вхождению заданных шаблонов
! = показать всё, что не соответствует заданным шаблонам
* = ноль или более вхождений
+ = одно или более вхождений
@ = ровно одно вхождение

Unfallverhütung

7. histverify

Am Anfang kann es ein wenig einschüchternd sein, die schnelle Ausführung von Befehlen aus der Historie mit der Abkürzung !! und !$.

Option histverify zu verwenden, da man zuerst sehen kann, wie Bash den Befehl interpretiert, bevor er tatsächlich ausgeführt wird:

$ shopt -s histverify
$ echo !$          # <= Bei Drücken von Enter wird der Befehl nicht ausgeführt
$ echo histverify  # <= Er wird zuerst auf dem Bildschirm angezeigt,
histverify         # <= und dann ausgeführt 

8. Noclobber

Wiederum zur Unfallverhütung, insbesondere um das Überschreiben einer bereits existierenden Datei mit dem Umleitungsoperator (>). Das kann katastrophal sein, wenn man kein Backup hat.

Option set -C verhindert ein solches Überschreiben. Bei Bedarf kann man den Schutz mit dem Operator umgehen >|:

$ touch afile
$ set -C
$ echo something > afile
-bash: afile: kann die bestehende Datei nicht überschreiben
$ echo something >| afile
$

Quelle: habr.com

60GB SSD 8Gb DDR4