Wenn Sie häufig die Linux-Befehlszeile verwenden, kann die effektive Verwendung des History-Befehls eine große Produktivitätssteigerung sein.
Unter Linux gibt es einen sehr nützlichen Befehl, der Ihnen alle zuletzt verwendeten Befehle anzeigt. Der Befehl heißt einfach history
.
Zeitstempel anzeigen
Normalerweise, wenn Sie history
eingeben In der Befehlszeile sehen Sie standardmäßig eine Zahl, gefolgt von den Befehlen, die Sie kürzlich verwendet haben. Zu Prüfzwecken kann es vorteilhaft sein, den Zeitstempel zusammen mit dem Befehl anzuzeigen, wie unten gezeigt.
Zeitstempel im history
aktivieren Befehlsausgabe müssen Sie das HISTTIMEFORMAT
konfigurieren Bash-Variable.
export HISTTIMEFORMAT="%F %T "
history | more
1 2020-06-25 19:02:39 systemctl restart network
2 2020-06-25 19:02:43 exit
3 2020-06-25 19:02:47 id
4 2020-06-25 19:02:56 cat /etc/hosts
Durchsuchen des Befehlsverlaufs
Dies ist möglicherweise Ihre am häufigsten verwendete Funktion des history
Befehl . Wenn Sie bereits einen sehr langen Befehl ausgeführt haben, können Sie den Verlauf einfach mit einem Schlüsselwort durchsuchen und denselben Befehl erneut ausführen, ohne ihn vollständig eingeben zu müssen.
- Drücken Sie
Control+R
und geben Sie das Schlüsselwort ein. - Drücken Sie die Eingabetaste, wenn Sie Ihren Befehl sehen, der den Befehl aus dem Verlauf ausführt.
Im folgenden Beispiel habe ich nach host
gesucht , der den vorherigen Befehl cat /etc/hosts
anzeigte im Verlauf, der das Wort host
enthielt .
(reverse-i-search)`host': cat /etc/hosts
cat /etc/hosts
#<ip-address> <hostname.domain.org> <hostname>
127.0.0.1 localhost.localdomain localhost server1
::1 localhost.localdomain localhost server1
Manchmal möchten Sie einen Befehl aus dem Verlauf bearbeiten, bevor Sie ihn ausführen. Sie können beispielsweise nach systemctl
suchen , was systemctl restart network
anzeigt Wählen Sie aus der Befehlshistorie diesen Befehl aus (drücken Sie ESC
Taste) und ändern Sie den restart
bis stop
.
Führen Sie es dann erneut aus, indem Sie einfach Enter
drücken .
(reverse-i-search)`systemctl': systemctl stop network
systemctl stop network
Wiederhole den zuletzt ausgeführten Befehl
Aus verschiedenen Gründen kann es vorkommen, dass Sie die vorherigen Befehle wiederholen. Im Folgenden finden Sie die 4 verschiedenen Möglichkeiten, den zuletzt ausgeführten Befehl zu wiederholen.
- Verwenden Sie den
up arrow
um den vorherigen Befehl anzuzeigen und drücken Sie die Eingabetaste, um ihn auszuführen. - Geben Sie
!!
ein und drücken Sie die Eingabetaste auf der Befehlszeile - Geben Sie
!-1
ein und drücken Sie die Eingabetaste in der Befehlszeile. - Drücken Sie
Control+P
zeigt den vorherigen Befehl an, drücken Sie die Eingabetaste, um ihn auszuführen.
Führen Sie einen bestimmten Befehl aus
Wenn Sie im folgenden Beispiel den Befehl Nr. 4 wiederholen möchten, können Sie !4
ausführen wie unten gezeigt.
history | more
systemctl restart network
exit
id
cat /etc/hosts
!4
cat /etc/hosts
#<ip-address> <hostname.domain.org> <hostname>
127.0.0.1 localhost.localdomain localhost server1
::1 localhost.localdomain localhost server1
Vorherigen Befehl ausführen, der mit einem bestimmten Wort beginnt
Geben Sie !
ein gefolgt von den Anfangsbuchstaben des Befehls, den Sie erneut ausführen möchten. Geben Sie im folgenden Beispiel !ps
ein und Enter, führte den vorherigen Befehl aus, beginnend mit ps
, was ps aux | grep yp
.
!ps
ps aux | grep yp
root 16947 0.0 0.1 36516 1264 ? Sl 13:10 0:00 ypbind
root 17503 0.0 0.0 4124 740 pts/0 S+ 19:19 0:00 grep yp
Begrenzen Sie die Anzahl der Verlaufselemente
Dies wird durch HISTSIZE
gesteuert und HISTFILESIZE
eingebaute Bash-Shell-Variablen. Hängen Sie die folgenden zwei Zeilen an Ihre ~/.bashrc
an Datei und melden Sie sich ab und dann wieder an.
HISTSIZE=1500
HISTFILESIZE=1500
Als Ergebnis jetzt history
ist so eingestellt, dass 1500 Befehle gespeichert werden.
Ändern Sie den Namen der Verlaufsdatei
Standardmäßig history
wird in ~/.bash_history
gespeichert Datei.
Fügen Sie die folgende Zeile zu .bash_profile
hinzu -Datei und melden Sie sich erneut bei der Bash-Shell an, um den Verlaufsbefehl in .my_commandline
zu speichern Datei anstelle von .bash_history
Datei.
HISTFILE=/root/.my_commandline
Dies wird verwendet, wenn Sie Befehle verfolgen möchten, die von verschiedenen Terminals mit unterschiedlichen Verlaufsdateinamen ausgeführt werden.
Beseitigen Sie den kontinuierlich wiederholten Eintrag aus dem Verlauf
Im folgenden Beispiel pwd
wurde dreimal eingegeben, wenn Sie den Verlauf machen, können Sie alle 3 fortlaufenden Vorkommen davon sehen. Um Duplikate zu eliminieren, setzen Sie HISTCONTROL
zu ignoredups
wie unten gezeigt.
history | tail -4
44 pwd
45 pwd
46 pwd
47 history | tail -4
export HISTCONTROL=ignoredups
history | tail -3
56 export HISTCONTROL=ignoredups
57 pwd
58 history | tail -4
Duplikate im gesamten Verlauf löschen
Die ignoredups
oben gezeigt entfernt Duplikate nur, wenn es sich um aufeinanderfolgende Befehle handelt. Um Duplikate im gesamten Verlauf zu eliminieren, setzen Sie den HISTCONTROL
zu erasedups
wie unten gezeigt.
export HISTCONTROL=erasedups
pwd
systemctl restart network
history | tail -3
38 pwd
39 systemctl restart network
40 history | tail -3
ls -l
systemctl restart network
history | tail -6
35 export HISTCONTROL=erasedups
36 pwd
37 history | tail -3
38 ls -l
39 systemctl restart network
40 history | tail -6
Zwingt den Verlauf, sich an einen bestimmten Befehl nicht zu erinnern
Wenn Sie einen Befehl ausführen, können Sie history
anweisen um den Befehl zu ignorieren, indem Sie HISTCONTROL
setzen zu ignorespace
und geben Sie ein Leerzeichen vor dem Befehl ein, wie unten gezeigt.
Ich sehe viele Junior-Systemadministratoren, die sich darüber aufregen, da sie einen Befehl aus der Historie verstecken können. Es ist gut zu verstehen, wie ignorespace
funktioniert. Als Best Practice sollten Sie jedoch nichts absichtlich vor dem Verlauf verbergen.
export HISTCONTROL=ignorespace
ls -ltr
pwd
systemctl restart network #Note that there is a space at the beginning of service, to ignore this command from history
history | tail -3
67 ls -l
68 pwd
69 history | tail -3
Löschen Sie den gesamten vorherigen Verlauf
Manchmal möchten Sie vielleicht den gesamten vorherigen history
löschen , aber den Verlauf vorantreiben möchten.
history -c
Wörter aus Verlaufsbefehlen ersetzen
Wenn Sie den history
durchsuchen , möchten Sie vielleicht einen anderen Befehl ausführen, aber denselben Parameter aus dem gerade gesuchten Befehl verwenden.
Im Beispiel unten der !!:$
neben dem vi
Befehl erhält das Argument vom vorherigen Befehl zum aktuellen Befehl.
ls nginx.conf
nginx.conf
vi !!:$
vi nginx.conf
Im Beispiel unten ist das !^
neben dem vi-Befehl erhält das erste Argument vom vorherigen Befehl (d. h. cp
Befehl) zum aktuellen Befehl (also vi
Befehl).
cp nginx.conf nginx.conf.bak
vi !^
vi nginx.conf
Einen bestimmten Befehl durch ein bestimmtes Argument ersetzen
Im Beispiel unten !cp:2
sucht nach dem vorherigen Befehl im Verlauf, der mit cp beginnt, nimmt das zweite Argument von cp und ersetzt es wie unten gezeigt durch den Befehl ls -l.
cp ~/longname.txt /really/a/very/long/path/long-filename.txt
ls -l !cp:2
ls -l /really/a/very/long/path/long-filename.txt
Im Beispiel unten !cp:$
sucht nach dem vorherigen Befehl im Verlauf, der mit cp beginnt, und nimmt das letzte Argument (in diesem Fall auch das zweite Argument, wie oben gezeigt) von cp und ersetzt es durch den Befehl ls -l, wie unten gezeigt.
ls -l !cp:$
ls -l /really/a/very/long/path/long-filename.txt
Verwendung des Verlaufs deaktivieren
Wenn Sie den history
deaktivieren möchten alles zusammen und möchten nicht, dass sich die Bash-Shell die von Ihnen eingegebenen Befehle merkt, setzen Sie die HISTSIZE
auf 0 wie unten gezeigt.
export HISTSIZE=0
Ignoriere bestimmte Befehle aus dem Verlauf
Manchmal möchten Sie Ihren Verlauf vielleicht nicht mit einfachen Befehlen wie pwd
überladen und ls
. Verwenden Sie HISTIGNORE
um alle Befehle aus dem Verlauf anzugeben, die Sie ignorieren möchten.
Bitte beachten Sie, dass das Hinzufügen von ls
zur HISTIGNORE
ignoriert nur ls
und nicht ls -l
. Sie müssen also genau den Befehl angeben, den Sie aus dem Verlauf ignorieren möchten.
export HISTIGNORE="pwd:ls:ls -ltr:"
pwd
ls
ls -l
systemctl restart network
history | tail -3
79 export HISTIGNORE="pwd:ls:ls -l:"
80 systemctl restart network
81 history
[Note that history did not record pwd, ls and ls -l]
Weitere Informationen zum history
Befehl unter Linux finden Sie auf der Handbuchseite.