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

Bash-Bang-Befehle:Ein Must-Know-Trick für die Linux-Befehlszeile

Vergiss jemals, sudo auszugeben vor einem Befehl? Mussten Sie jemals einen ganzen Befehl wiederholen, weil Sie einen Tippfehler hatten? Haben Sie jemals gedacht, dass es schön wäre, Verknüpfungen zu haben, um Ihre vorherigen Befehle zu wiederholen? Wenn das nach Ihnen klingt, habe ich etwas zu teilen. In diesem Artikel zeige ich Ihnen, wie Sie bash bang (! )-Befehle, die es einfach machen, Befehle zu wiederholen und Fehler zu beheben.

Grundlagen der Befehlswiederholung

Bash bietet Zugriff auf die Liste der zuvor ausgegebenen Befehle, die als Befehlsverlauf bezeichnet wird. Der Wert von HISTSIZE Die Variable legt die Anzahl der Befehle fest, die in Ihrer Verlaufsliste gespeichert werden. Standardmäßig ist dieser Wert 500. Diese zuvor ausgegebenen Befehle (bekannt als Ihre Verlaufsliste) werden in Ihrer Verlaufsdatei gespeichert. Sein Standardspeicherort ist ~/.bash_history , und dieser Speicherort wird in der Shell-Variable HISTFILE gespeichert .

Unter der Haube führen Bang (!)-Befehle Befehle aus Ihrer Bash-Verlaufsliste in den Eingabestrom ein. Diese Funktion macht es einfach, Befehle zu wiederholen, Text zu ersetzen, Argumente zu manipulieren und Tippfehler in Ihren vorherigen Befehlen schnell zu korrigieren.

Beispiele für Befehlswiederholungen

Hier sind einige Beispiele dafür, was Sie mit bash bang machen können.

Wiederhole den letzten Befehl, der mit dem Anfang einer Zeichenfolge übereinstimmt

Der Knall (! ) gefolgt vom ersten Zeichen (oder String), das mit dem Befehl übereinstimmt, den Sie ausführen möchten, wird die letzte Instanz dieses Befehls wiederholt:

$ ls
dir  dir1  dir2  file  file1  file2  hello.txt

$ !l
ls 
dir  dir1  dir2  file  file1  file2  hello.txt

$ !ls
ls 
dir  dir1  dir2  file  file1  file2  hello.txt

 

Wiederhole den letzten Befehl, der irgendwo in einer Zeichenfolge passt

Der !?<string> format tut dasselbe wie oben, aber <string> muss nicht am Anfang des Befehls stehen:

$ cat hello.txt 
Hello world ..!
$ !?hello.txt
cat hello.txt 
Hello world ..!
 

Wiederhole den n-ten Befehl aus deinem Verlauf

Das Wiederholen des n-Befehls aus Ihrem Bash-Verlauf (von oben nach unten zählen) ist so einfach wie die Verwendung eines Knalls mit der betreffenden Zahl:

!10
 

Wiederholen Sie den n-ten Befehl aus Ihrem letzten Verlaufseintrag

Das Wiederholen des n-Befehls aus Ihrem Bash-Verlauf (von unten nach oben zählen) ist so einfach wie die Verwendung eines Knalls mit einem Minus und der betreffenden Zahl:

!-10

 

Letzten Befehl wiederholen

Wenn es einen Bang-Befehl gibt, den ich ständig benutze, wäre es !! . Das Bang-Bang (!! ) wiederholt den letzten Befehl aus der Verlaufsliste und verhält sich genauso wie !-1 :

$ cat hello.txt 
Hello world ..!
$ !!
cat hello.txt 
Hello world ..!
 

Bang-bang (!! ) ist nützlich, wenn Sie den vorherigen Befehl wiederholen oder sudo voranstellen müssen , oder Pipe-Ausgabe:

$ yum update
Loaded plugins: priorities, update-motd, upgrade-helper
You need to be root to perform this command.
$ sudo !!
sudo yum update
Loaded plugins: priorities, update-motd, upgrade-helper
 
$ ls
dir  dir1  dir2  file  file1  file2  hello.txt
$ !! | grep file
ls | grep file
file
file1
file2
$ 
 

Wiederholen, aber einen String ersetzen

Oft gebe ich lange Befehle aus und gebe sie mit verschiedenen Schaltern erneut aus. Oder ich muss einen Befehl erneut ausgeben, weil mein vorheriger Befehl einen Tippfehler enthält. Durch String-Ersetzung kann ich dies tun, ohne den ganzen langen Befehl erneut eingeben zu müssen.

Es gibt zwei Möglichkeiten, wie wir dieses Ergebnis erzielen können. Einer ist durch die Verwendung von:

!!:s^<old>^<new>

Diese Struktur ersetzt den vorherigen Befehl durch eine Zeichenfolge:

$ ls /etc/httpd/conf.d
autoindex.conf  notrace.conf  php.conf  php-conf.7.2  README  userdir.conf  welcome.conf
$ !!:s^conf.d^conf
ls /etc/httpd/conf
httpd.conf  magic
 

Sie können dasselbe sogar mit !<string>:s^<old>^<new> machen :

$ !l:s^conf^conf.d
ls /etc/httpd/conf.d
autoindex.conf  notrace.conf  php.conf  php-conf.7.2  README  userdir.conf  welcome.conf
 

Diese Option ist nützlich, wenn Sie eine String-Ersetzung für einen Befehl durchführen müssen, der nicht der neueste war.

Die andere Möglichkeit, dieses Ergebnis zu erreichen, ist die Struktur ^<old>^<new> . Dieses Format ersetzt Zeichenfolgen für den neuesten Befehl, ähnlich wie !!:s^<old>^<new> :

$ cd /etc/httpd/conf.d
/etc/httpd/conf.d 
/etc/httpd/conf.d $ ^conf.d^conf
cd /etc/httpd/conf
/etc/httpd/conf $ 
 

Befehlsargumente wiederholen

Oft verwenden wir dieselben Argumente aus einem vorhergehenden Befehl. Wenn Sie ein langes Argument haben, möchten Sie es wahrscheinlich mit dem nächsten Befehl wiederholen. Schauen wir uns einige Bash-Bang-Befehle an, die dies für uns erledigen können.

Zuerst das Format !:n wiederholt das n-Argument aus dem vorhergehenden Befehl mit 0 der Befehl selbst ist:

~/project $ ls -a -l 
total 32
drwxrwxr-x  7 user user 4096 Sep  9 20:30 .
drwx------ 16 user user 4096 Sep  9 20:10 ..
drwxrwxr-x  2 user user 4096 Sep  9 16:02 dir
drwxrwxr-x  2 user user 4096 Sep  9 16:02 dir1
drwxrwxr-x  2 user user 4096 Sep  9 16:02 dir2
drwxrwxr-x  2 user user 4096 Sep  9 20:30 dir3
-rw-rw-r--  1 user user    0 Sep  9 16:02 file
-rw-rw-r--  1 user user    0 Sep  5 16:07 .file
-rw-rw-r--  1 user user    0 Sep  9 16:01 file1
-rw-rw-r--  1 user user    0 Sep  9 16:01 file2
-rw-rw-r--  1 user user   16 Sep  9 16:03 hello.txt
drwxrwxr-x  2 user user 4096 Sep  5 16:08 .hidden_dir
-rw-rw-r--  1 user user    0 Sep  5 16:08 .hidden_file
~/project $ ls !:1
ls -a
.  ..  dir  dir1  dir2  dir3  file  .file  file1  file2  hello.txt  .hidden_dir  .hidden_file
 

Zweitens !!:$ wiederholt das letzte Argument aus dem vorhergehenden Befehl. Sie können diesen Befehl zu !$ verkürzen und $_ :

project $ mkdir dir3
project $ cd !$
cd dir3
project/dir3 $ 
 

Sie könnten fragen:„Was ist, wenn ich diese Technik mit einem Befehl verwenden möchte, den ich zuvor ausgegeben habe, aber nicht mit dem letzten?“ Sie können dies mit Bang-Befehlen tun, indem Sie entweder:

verwenden
!<command you've issued previously >:$ 

$ mkdir -p hello/test1/test2
$ ls !mkdir:$
ls hello/test1/test2 

oder:

!<command you've issued previously >:n

$ ls !mk:2
ls hello/test1/test2 

Manchmal möchten Sie vielleicht den Befehl ausdrucken, aber nicht ausführen lassen. Sie können diese Aufgabe mit !:p erledigen :

~/project $ cat hello.txt 
Hello world ..!
~/project $ !:p
cat hello.txt 
~/project $ 
 

Tatsächlich können Sie jeden Befehl in Ihrer Verlaufsliste ausdrucken, ohne ihn auszuführen. Geben Sie einfach einen der folgenden Befehle aus:

$ !<command>:p

$ !mkdir:p
mkdir -p hello/test1/test2

$ !<string>:p

$ !su:p
sudo yum check-update
$ !mk:p
mkdir -p hello/test1/test2 

Befehle mit umgekehrter i-Suche aufrufen

Als Systemadministrator geben Sie wahrscheinlich jeden Tag Hunderte von Befehlen aus. Möglicherweise fällt es Ihnen schwer, sich an einige Befehle oder einen Teil davon zu erinnern. Hier ist eine weitere Option, um die gewünschte zu finden.

(reverse-i-search)`<search string>’: <output> (reverse-i-search)`yu': sudo yum check-update
(reverse-i-search)`cd': cd /etc 

STRG+R aktiviert reverse-i-search , das einen schönen Suchbereich bietet, mit dem Sie einfacher durch Ihren Verlauf navigieren können.

Fazit

Dies sind nützliche Bash Bang (! )-Befehle, mit denen jeder Systemadministrator vertraut sein sollte. Diese Befehle sparen viel Zeit und geben Ihnen die Möglichkeit, Befehlsfehler schnell zu beheben. Lesen Sie mehr über Bash in der Manpage mit dem Befehl man bash .

[Möchten Sie Red Hat Enterprise Linux ausprobieren? Jetzt kostenlos herunterladen.]


Linux
  1. 8 Tipps für die Linux-Kommandozeile

  2. Haben Sie eine Kuh an der Linux-Befehlszeile

  3. Yoda – Der persönliche Kommandozeilen-Assistent für Ihr Linux-System

  4. 8 Linux-virsh-Unterbefehle zum Verwalten von VMs auf der Befehlszeile

  5. Grundlagen der Linux-Befehlszeile – Ausführen von Befehlen über die Befehlszeile

Ripgrep – Das schnellste Kommandozeilen-Suchtool für Linux

Die 40 nützlichen Linux-Server-Befehle für Anfänger und Profis

Die 50 nützlichen Linux-IP-Befehle für Netzwerkadministratoren

5 Befehle zum Anzeigen des Inhalts einer Datei in der Linux-Befehlszeile

Praktische Linux- und Unix-Tee-Befehle für den Linux-Administrator

Vier Webbrowser für die Linux-Befehlszeile