Der '!'
Symbol oder Operator in Linux kann als Logische Negation verwendet werden Operator sowie zum Abrufen von Befehlen aus dem Verlauf mit Optimierungen oder zum Ausführen eines zuvor ausgeführten Befehls mit Änderung. Alle folgenden Befehle wurden explizit in der Bash-Shell überprüft. Obwohl ich es nicht überprüft habe, wird ein Großteil davon nicht in einer anderen Shell ausgeführt. Hier gehen wir auf die erstaunliche und mysteriöse Verwendung von '!'
ein Symbol oder Operator in Linux-Befehlen.
1. Führen Sie einen Befehl aus dem Verlauf nach Befehlsnummer aus.
Möglicherweise ist Ihnen nicht bewusst, dass Sie einen Befehl aus Ihrem Verlauf ausführen können Befehl (bereits/früher ausgeführte Befehle). Suchen Sie zunächst die Befehlsnummer, indem Sie „history“ ausführen ‘ Befehl.
$ history
Führen Sie nun einen Befehl aus dem Verlauf aus nur durch die Nummer, bei der es in der Ausgabe von Geschichte erscheint . Angenommen, Sie führen einen Befehl aus, der unter der Nummer 1551 angezeigt wird in der Ausgabe von 'history ‘ Befehl.
$ !1551
Und es führt den Befehl aus (oberster Befehl im obigen Fall), der unter der Nummer 1551 aufgeführt wurde . Diese Methode zum Abrufen bereits ausgeführter Befehle ist besonders bei langen Befehlen sehr hilfreich. Sie müssen es nur mit ![Nummer, bei der es in der Ausgabe des Verlaufsbefehls erscheint] aufrufen .
2. Führen Sie den zuvor ausgeführten Befehl als vorletzten Befehl, vorletzten Befehl usw. aus.
Sie können diese Befehle ausführen, die Sie zuvor ausgeführt haben, indem ihre Ausführungsreihenfolge als letzter Ausführungsbefehl als -1 dargestellt wird , vorletzte als -2 , siebtletzte als -7 ,….
Verlauf der ersten Ausführung Befehl, um eine Liste der zuletzt ausgeführten Befehle zu erhalten. Es ist notwendig, den Verlauf auszuführen Befehl, damit Sie sicher sein können, dass es keinen Befehl wie rm command > file
gibt und andere, um sicherzustellen, dass Sie nicht versehentlich gefährliche Befehle ausführen. Überprüfen Sie dann Sechster letzter Befehl, Acht letzter Befehl und Zehnter letzter Befehl.
$ history $ !-6 $ !-8 $ !-10
3. Übergeben Sie die Argumente des letzten ausgeführten Befehls an den neuen Befehl, ohne ihn erneut einzugeben
Ich muss den Inhalt des Verzeichnisses „/home/$USER/Binary/firefox“ auflisten ‘ Also habe ich geschossen.
$ ls /home/$USER/Binary/firefox
Dann wurde mir klar, dass ich „ls -l hätte feuern sollen ‘ um zu sehen, welche Datei dort ausführbar ist? Also soll ich den ganzen Befehl nochmal eingeben! Nein brauche ich nicht. Ich muss nur das letzte Argument zu diesem neuen Befehl tragen als:
$ ls -l !$
Hier !$
überträgt Argumente, die im letzten Befehl übergeben wurden, in diesen neuen Befehl.
4. Wie behandelt man zwei oder mehr Argumente mit (!)
Nehmen wir an, ich habe eine Textdatei 1.txt erstellt auf dem Desktop.
$ touch /home/avi/Desktop/1.txt
und kopieren Sie es dann nach „/home/avi/Downloads ‘ Verwenden Sie den vollständigen Pfad auf beiden Seiten mit cp Befehl.
$ cp /home/avi/Desktop/1.txt /home/avi/downloads
Jetzt haben wir zwei Argumente mit cp übergeben Befehl. Das erste ist „/home/avi/Desktop/1.txt ‘ und das zweite ist ‚/home/avi/Downloads ‘, behandeln wir sie anders, führen Sie einfach echo [arguments]
aus um beide Argumente unterschiedlich auszugeben.
$ echo “1st Argument is : !^” $ echo “2nd Argument is : !cp:2”
Hinweis Das erste Argument kann als “!^”
ausgegeben werden und der Rest der Argumente kann durch Ausführen von “![Name_of_Command]:[Number_of_argument]”
ausgegeben werden .
Im obigen Beispiel war der erste Befehl „cp ‘ und das zweite Argument wurde zum Drucken benötigt. Daher “!cp:2”
, sagen Sie bei einem Befehl xyz mit 5 Argumenten ausgeführt wird und Sie das vierte Argument benötigen, können Sie “!xyz:4”
verwenden , und verwenden Sie es, wie Sie möchten. Auf alle Argumente kann mit “!*”
zugegriffen werden .
5. Letzten Befehl anhand von Schlüsselwörtern ausführen
Wir können den zuletzt ausgeführten Befehl anhand von Schlüsselwörtern ausführen. Wir können es wie folgt verstehen:
$ ls /home > /dev/null [Command 1] $ ls -l /home/avi/Desktop > /dev/null [Command 2] $ ls -la /home/avi/Downloads > /dev/null [Command 3] $ ls -lA /usr/bin > /dev/null [Command 4]
Hier haben wir denselben Befehl (ls) verwendet aber mit unterschiedlichen Schaltern und für unterschiedliche Ordner. Außerdem haben wir die Ausgabe jedes Befehls an ‚/dev/null gesendet ‘ Da wir uns nicht mit der Ausgabe des Befehls befassen, bleibt auch die Konsole sauber.
Jetzt letzten Laufbefehl anhand von Schlüsselwörtern ausführen.
$ ! ls [Command 1] $ ! ls -l [Command 2] $ ! ls -la [Command 3] $ ! ls -lA [Command 4]
Überprüfen Sie die Ausgabe und Sie werden erstaunt sein, dass Sie bereits ausgeführte Befehle nur mit ls
ausführen Schlüsselwörter.
6. Die kraft von !! Betreiber
Sie können Ihren letzten Ausführungsbefehl mit (!!)
ausführen/ändern . Es ruft den letzten Ausführungsbefehl mit alter/tweak im aktuellen Befehl auf. Lassen Sie uns Ihnen das Szenario
Letzten Tag habe ich ein Einzeiler-Skript ausgeführt, um meine private IP zu erhalten, also führe ich aus,
$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/
Dann habe ich plötzlich herausgefunden, dass ich die Ausgabe des obigen Skripts in eine Datei ip.txt umleiten muss , also was soll ich tun? Soll ich den gesamten Befehl erneut eingeben und die Ausgabe in eine Datei umleiten? Nun, eine einfache Lösung ist die Verwendung von UP
Navigationstaste und fügen Sie '> ip.txt'
hinzu um die Ausgabe in eine Datei umzuleiten als.
$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/ > ip.txt
Danke an den Lebensretter UP
Navigationstaste hier. Betrachten Sie nun die folgende Bedingung, wenn ich das nächste Mal das folgende Einzeiler-Skript ausführe.
$ ifconfig | grep "inet addr:" | awk '{print $2}' | grep -v '127.0.0.1' | cut -f2 -d:
Sobald ich das Skript ausführe, gab die Bash-Eingabeaufforderung einen Fehler mit der Meldung “bash: ifconfig: command not found”
zurück , Es war nicht schwer für mich zu erraten, dass ich diesen Befehl als Benutzer ausführe, wo er als root ausgeführt werden sollte.
Was ist die Lösung? Es ist schwierig, sich bei root anzumelden und dann den gesamten Befehl erneut einzugeben! Auch (NACH-OBEN-Navigationstaste ) im letzten Beispiel kam hier nicht zur Rettung. So? Wir müssen “!!”
aufrufen ohne Anführungszeichen, wodurch der letzte Befehl für diesen Benutzer aufgerufen wird.
$ su -c “!!” root
Hier su ist der Switch-Benutzer, der root ist, -c
ist, den spezifischen Befehl als Benutzer auszuführen und der wichtigste Teil !!
wird durch den Befehl ersetzt, und der letzte Ausführungsbefehl wird hier ersetzt. Ja! Sie müssen das Root-Passwort angeben.
Ich benutze !!
hauptsächlich in den folgenden Szenarien,
1. Wenn ich apt-get ausführe Befehl als normaler Benutzer, erhalte ich normalerweise eine Fehlermeldung, die besagt, dass Sie keine Berechtigung zum Ausführen haben.
$ apt-get upgrade && apt-get dist-upgrade
Opps-Fehler … keine Sorge, führen Sie den folgenden Befehl aus, um ihn erfolgreich zu machen..
$ su -c !!
Genauso wie ich für,
$ service apache2 start or $ /etc/init.d/apache2 start or $ systemctl start apache2
OOPS Benutzer nicht berechtigt, diese Aufgabe auszuführen, also führe ich aus..
$ su -c 'service apache2 start' or $ su -c '/etc/init.d/apache2 start' or $ su -c 'systemctl start apache2'
7. Führen Sie einen Befehl aus, der sich auf alle Dateien außer ![FILE_NAME]
auswirkt
Der !
(Logisches NICHT ) kann verwendet werden, um den Befehl für alle Dateien/Erweiterungen auszuführen, außer denen, die sich hinter '!'
befinden .
A. Entfernen Sie alle Dateien aus einem Verzeichnis außer dem, dessen Name 2.txt ist .
$ rm !(2.txt)
B. Entfernen Sie alle Dateitypen aus dem Ordner mit Ausnahme desjenigen, dessen Erweiterung „pdf“ lautet ‘.
$ $ rm !(*.pdf)
8. Überprüfen Sie, ob ein Verzeichnis (z. B. /home/avi/Tecmint) existiert oder nicht? Printf, ob das besagte Verzeichnis existiert oder nicht.
Hier verwenden wir '! -d'
um zu überprüfen, ob das Verzeichnis existiert oder nicht, gefolgt vom logischen AND-Operator (&&)
um dieses Verzeichnis zu drucken existiert nicht und logischer ODER-Operator (||)
zum Drucken des Verzeichnisses ist vorhanden.
Logisch ist, wenn die Ausgabe von [ ! -d /home/avi/Tecmint ]
ist 0 , wird ausgeführt, was hinter dem logischen UND liegt andernfalls geht es zu Logical OR (||)
und ausführen, was hinter dem logischen ODER liegt .
$ [ ! -d /home/avi/Tecmint ] && printf '\nno such /home/avi/Tecmint directory exist\n' || printf '\n/home/avi/Tecmint directory exist\n'
9. Prüfen, ob ein Verzeichnis existiert oder nicht? Wenn nicht, beende den Befehl.
Ähnlich wie bei der obigen Bedingung, aber hier wird der Befehl beendet, wenn das gewünschte Verzeichnis nicht existiert.
$ [ ! -d /home/avi/Tecmint ] && exit
10. Erstellen Sie ein Verzeichnis (z. B. Test) in Ihrem Home-Verzeichnis, falls es noch nicht existiert.
Eine allgemeine Implementierung in der Skriptsprache, bei der, wenn das gewünschte Verzeichnis nicht existiert, eines erstellt wird.
[ ! -d /home/avi/Tecmint ] && mkdir /home/avi/Tecmint
Das ist alles für jetzt. Wenn Sie eine andere Verwendung von '!'
kennen oder darauf stoßen was wissenswert ist, Sie können uns Ihren Vorschlag gerne im Feedback mitteilen. Bleiben Sie verbunden!