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