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+Rund 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 arrowum 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
!-1ein und drücken Sie die Eingabetaste in der Befehlszeile. - Drücken Sie
Control+Pzeigt 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.