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

Verwenden von Wortmodifikatoren mit Bash-Verlauf in Linux

In meinem Artikel Parsen des Bash-Verlaufs habe ich gezeigt, wie Sie auf Elemente in Ihrem Shell-history verweisen können sowohl nach Zeilennummer als auch nach Wortposition. Sobald Sie das Parsen der history von Bash gemeistert haben B. nach Zeilen- und Wortindex, können Sie von den Modifikatoren profitieren, die für die history verfügbar sind Befehl.

Die histexpand-Shell-Option

Bevor wir über history sprechen Beim Parsen ist es erwähnenswert, dass das Ausrufezeichen (! )-Notation ist dank histexpand nur für Ihre Bash-Shell verfügbar Möglichkeit. Weil histexpand standardmäßig aktiviert ist, wird es von vielen Benutzern nie groß in Betracht gezogen. Es ist jedoch die Option, die die Erweiterung eines ! erzwingt zur Liste der history Einträge.

Wenn die Option deaktiviert ist, verlieren Sie diese Funktionalität. Zum Beispiel:

$ echo foo
$ set +o histexpand
$ !-2
bash: !-2: command not found
$ set -o histexpand
$ !-3
echo foo
foo

Im Allgemeinen histexpand ist standardmäßig aktiviert, außer in nicht interaktiven Shells (z. B. in einem Shell-Skript). Sollte history Kurzschrift versagt, können Sie entweder histexpand aktivieren als Shell-Option verwenden oder den vollständigen history verwenden Befehl, der durch histexpand impliziert wird :

$ echo foo
$ set +o histexpand
$ history -p !-2
echo foo
foo

In einem Shell-Skript müssen Sie history aktivieren und geben Sie einen Ort an, an dem history kann gespeichert werden:

HISTFILE=/tmp/history.log
set -o histexpand
set -e

## some code here

## clean up
rm /tmp/history.log

Ein Vorteil des Verlassens von histexpand deaktiviert ist, dass Sie die Ausführlichkeit der Ergebnisse von history verlieren Aktionen. Zum Beispiel mit histexpand aktiviert, das erste, was nach einem history an Ihre Shell zurückgegeben wird Befehl ist die erweiterte Version dessen, was ausgeführt wird:

$ set -o histexpand
$ echo foo
foo
$ !!
echo foo
foo

Mit histexpand ausgeschaltet, Ihr history Befehl ist länger, aber die Ergebnisse sind knapper:

$ set +o histexpand
$ echo foo
foo
$ !!
foo

Ob Sie eine Verwendung für history finden in einem Shell-Skript ist Ihnen überlassen, aber history Modifikatoren haben einige interessante Abkürzungen, die sie in manchen Fällen besonders praktisch machen.

Verlaufsmodifikatoren

Modifikatoren zum history Auswahlen werden durch einen Doppelpunkt gekennzeichnet (: ) gefolgt von einem Modifikatorzeichen. Einige Modifikatoren können mit anderen kombiniert werden.

Dateinamensuffix

Um das Suffix eines Arguments zu löschen, verwenden Sie r Modifikator.
Dies ist ähnlich wie basename .

$ ls -lgGh aLongFileNameWith-a_complex-syntax-1.tgz
-rw-r--r-- 1 0 Mar  9 11:23 aFileNameWith-a_complex-syntax-1.rev.tgz

$ echo !!:2:r
echo aLongFileNameWith-a_complex-syntax-1
aLongFileNameWith-a_complex-syntax-1

Das r Modifikator ist nicht superintelligent. Es findet einfach den letzten Punkt in einem Dateinamen und schneidet das Suffix ab, das manchmal nicht mit dem übereinstimmt, was Sie sich als Dateisuffix vorstellen, also in gewisser Weise basename bietet größere Flexibilität.

$ set +o histexpand
$ ls -lgGh aLongFileNameWith-a_complex-syntax-1.tar.gz
$ echo !!:2:r
aLongFileNameWith-a_complex-syntax-1.tar

Mit e lässt sich das Gegenteil erreichen Modifikator:

$ set +o histexpand
$ echo aLongFileNameWith-a_complex-syntax-1.tgz
aLongFileNameWith-a_complex-syntax-1.tgz
$ echo !!:2:e
.tgz

Dateinamen

Eine einfache Version von dirname ist mit dem h verfügbar Modifikator:

$ set +o histexpand
$ echo src/spacer.sh
src/spacer.sh
$ echo !!^:h
src

Und die andere Seite dieses Ausdrucks ist mit t verfügbar Modifikator:

$ set +o histexpand
$ echo src/spacer.sh
src/spacer.sh
$ echo !!^:t
spacer.sh

String-Ersetzung

Möglicherweise der am weitesten verbreitete Modifikator von history ist eine Zeichenfolgensubstitution. Beispielsweise hat jeder Administrator einer gemischten Umgebung dies irgendwann in eine Red Hat Enterprise Linux-Box eingegeben:

$ sudo apt install tmux

Ein solcher Fehler lässt sich leicht durch String-Ersetzung beheben:

$ ^apt^dnf
sudo dnf install tmux

Sie können sogar einige Optionen hinzufügen:

$ ^apt^dnf -y
sudo dnf -y install tmux

Diese history Syntax ist eine Abkürzung für s Modifikator. Die vollständige Syntax lautet beispielsweise !!:s/apt/dnf und kann daher für Elemente nützlich sein, die mehrere Zeilen in Ihrem history zurückliegen . Angenommen, Sie haben vor drei Befehlen einen nützlichen Befehl ausgegeben und möchten jetzt einen ähnlichen Befehl ausführen:

$ !-3:s/vi/emacs/
sudo dnf install -y emacs

Wie sed , tritt diese Ersetzung standardmäßig nur einmal auf, aber Sie können sie mit dem g global machen (in Bezug auf die Zeile, die Sie abrufen). Modifikator:

$ pip update pip
[...]
$ !!:gs:/pip/pip3/
pip3 update pip3

Sicherheit geht vor:So führen Sie einen Verlaufs-Trockenlauf durch

Return drücken nach einem modifizierten history Zeile kann manchmal stressig sein, besonders wenn die Zeile, die Sie erneut ausführen möchten, zwischen besonders gefährlichen Befehlen eingebettet ist oder wichtige Dateien betrifft. Wenn Sie den Befehl überprüfen möchten, den Sie ändern und ausführen möchten, können Sie den p verwenden Modifikator am Ende eines history Änderung.

$ !-32:0-:s/mv/trash/:p
trash important.txt status.txt pay.txt

Der Befehl, den Sie als Ergebnis sehen, ist das erweiterte Element aus history , wurde aber noch nicht ausgeführt. Sie können es manuell ausführen, indem Sie Up drücken Pfeil oder Ctrl+P , jetzt, wo es für Sie gelöst wurde. Mit Verifizierung (p ) ist im Allgemeinen eine gute Idee, wenn Sie neu in der Verwendung des history sind Befehl in der Produktion.

Abschluss

Ihr Bash-Verlauf kann für viele Dinge nützlich sein, ob es darum geht, auf das zurückzublicken, was Sie den ganzen Tag getan haben, oder einfach Ihre Arbeit effizienter zu gestalten, indem Sie Informationsblöcke wiederverwenden, an denen Sie bereits gearbeitet haben, um herauszufinden. Je mehr Sie mit Verlaufsmodifikatoren üben, desto nützlicher werden sie. Erlauben Sie sich, (vorsichtig) durch einige zu stolpern, während Sie die Syntax lernen, und bald werden Sie Befehle und Argumente mit weniger Tastendrücken als je zuvor abrufen können.

[ Möchten Sie Red Hat Enterprise Linux ausprobieren? Laden Sie es jetzt kostenlos herunter. ]


Linux
  1. So löschen Sie den BASH-Befehlszeilenverlauf in Linux

  2. So löschen Sie den Bash-Verlauf unter Linux

  3. Zeilenumbruch mit Mc verwenden?

  4. Verwenden des Linux-Sleep-Befehls in Bash-Skripten

  5. Verwenden des Linux-Basisnamenbefehls in Bash-Skripten

Verlaufsbefehl in Linux mit Beispielen

So aktivieren Sie den Zeitstempel im Bash-Verlauf unter Linux

Bash Echo-Befehl mit Beispielen in Linux erklärt

Planen Sie Jobs in Linux mit dem Befehl 'at'

Verwenden des Linux-Dirname-Befehls in Bash-Skripten

So löschen Sie den Bash-Verlauf in Linux und Mac