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. ]