Beispiele des Linux-Komplexes Bash-Ein-Liner

Beispiele des Linux-Komplexes Bash-Ein-Liner

Bash-Einzeiler können die Arbeitsbelastung reduzieren, etwas schnell automatisieren und die Leistung der ultimativen Systemsteuerung in Ihre Hände setzen. Im Laufe der Zeit werden Sie wahrscheinlich lernen, komplexere Einzeiler zu schreiben, und einige der Dinge, die Sie als erfahrener Fachmann schreiben. Trotzdem ist die Bash -Befehls- und Entwicklungssprache sehr strukturiert - und relativ leicht zu verstehen -, sobald Sie über das In und Outs informiert sind. Es ist wirklich so, als würde man eine Fremdsprache kompetent werden.

In diesem Tutorial lernen Sie:

  • So schreiben Sie fortgeschrittenere Bash-One-Liner-Befehle und -Skripts
  • Verstehen Sie, wie Sie verschiedene Befehle in Ein-Liner-Skripte kombinieren können
  • Verstehen Sie, wie die Ausgangscodes von einem Befehl bei Verwendung anderer Befehle beeinflussen können && Und ||
  • Verstehen Sie, wie die Eingabe von einem Befehl geändert werden kann und dann vom nächsten Befehl verwendet werden kann
  • Nutzung und reales Leben wie Beispiele für fortgeschrittenere Bash-Einzeiler
Beispiele des Linux-Komplexes Bash-Ein-Liner

Softwareanforderungen und Konventionen verwendet

Softwareanforderungen und Linux -Befehlszeilenkonventionen
Kategorie Anforderungen, Konventionen oder Softwareversion verwendet
System Linux-Verteilungsunabhängige
Software BASH -Befehlszeile, Linux -basiertes System
Andere Jedes Dienstprogramm, das standardmäßig nicht in der Bash -Shell enthalten ist sudo apt-Get Installieren Sie den Dienstprogramm (oder yum install Für Redhat -basierte Systeme)
Konventionen # - Erfordert, dass Linux -Commands mit Root -Berechtigungen entweder direkt als Stammbenutzer oder mithilfe von verwendet werden sudo Befehl
$-erfordert, dass Linux-Commands als regulärer nicht privilegierter Benutzer ausgeführt werden

Beispiel 1: Prozesskontrolle

Beginnen wir mit einem Beispiel dafür, wie bestimmte Prozesse in Bash in einer leicht zu befolgenden Art und Weise beendet werden können:

$ Sleep 3600 & [1] 1792341 $ ps -f | Grep 'Schlaf' Roel 1792441 1701839 0 12:59 Punkte/13 00:00:00 Schlaf 3600 Roel 1792452 1701839 0 12:59 Punkt 


Zuerst richten wir einen Schlafbefehl für 3600 Sekunden (eine Stunde) ein und finden diesen Prozess anschließend in der Prozessliste. Großartig, aber wir haben das eigentliche Grep Befehl als zusätzliche Zeile in der Ausgabe von Prozesslistenauflistung. Lassen Sie uns das filtern und die Prozess -ID als nächstes anstelle der vollständigen Prozessinformationsausgabe extrahieren:

$ ps -f | Grep 'Schlaf' | Grep -V Grep Roel 1792441 1701839 0 12:59 Punkte/13 00:00:00 Schlaf 3600 $ PSEEF | Grep 'Schlaf' | grep -v grep | awk 'print $ 2' 1792441 

Im ersten Befehl haben wir den aktiven Grep herausgefiltert. Im zweiten Befehl haben wir diesen noch einen Schritt weiter gedruckt, indem wir die zweite Spalte drucken $ 2 (innen awk) durch Verwendung der awk Befehl. Wir können jetzt einen Schritt weiter und tatsächlich verwenden töten dieser Prozess. Nehmen wir an, wir machen das mit Signal 9 das ist für jeden Linux -Prozess sehr zerstörerisch (Sigkill):

$ ps -f | Grep 'Schlaf' | grep -v grep | awk 'print $ 2' | Xargs töten -9 [1]+ getötet den Schlaf 3600 

Und wir können sehen, dass unser Prozess richtig getötet wurde. Während dies ein einfacheres Beispiel war, beinhaltete es 6 verschiedene Befehle: ps, Grep, Grep nochmal, awk, Xargs Und töten. Sie sehen.

Um mehr über Xargs zu erfahren.

Beispiel 2: Spaß mit Erfolg und Misserfolg!

$ echo '0'> a && echo '1'> b && echo '2'> c && ls macht nicht exist || ls a && ls b && ls c && ls d && ls e ls: Kann nicht zugreifen 'doNotexist': Keine solche Datei oder Verzeichnis A b c ls: Kann nicht zugreifen 'D': Keine solche Datei oder Verzeichnis 


Was für eine komplexe Linie! Doch sobald Sie wissen, wie man es liest, oder vielleicht schon, ist es sehr einfach zu lesen. Lassen Sie uns nachweisen, dass diese Behauptung gültig ist, indem wir den Befehl in kleineren Bissgrößen aufbrechen, die leichter zu verstehen sind und folgen sind:

$ echo '0'> a && echo '1'> b && echo '2'> c 

All diese Befehle ist mit einer kleinen Einschränkung dieselbe wie die folgende:

$ echo '0'> a $ echo '1'> b $ echo '2'> c 

Also, was ist der Unterschied (und die kleine Einschränkung)?

Dass in dieser letzten Reihe von Befehlen jeder Befehl ausgeführt wird, unabhängig von dem Ergebnis des vorherigen Befehls. Die vorherige Sequenz (verwendet &&) wird nur zur zweiten fortfahren Echo Wenn Das Ergebnis des ersten Befehls war 0 (ich.e. Erfolg - im Bash -Erfolg in einem Befehl wird durch angegeben 0 und Misserfolg mit 1 oder höher als Exit -Code).

Somit die Befehlssequenz verwendet && könnte auch wie folgt geschrieben werden;

$ echo '0'> a $ if [$ ? -eq 0]; dann echo '1'> b; fi $ wenn [$ ? -eq 0]; dann echo '2'> c; fi 

Der $ ? (oder $? In kurzer Syntax) enthält Variable immer das Ergebnis des letzten Befehls, ich.e. der Ausgangscode (0, 1 oder höher) erzeugt durch den letzten Befehl.

Wie wir sehen können, die Einzeilenschöpfung von echo '0'> a && echo '1'> b && echo '2'> c Sicherlich ist für die Augen und das Verständnis jetzt einfacher und verringert definitiv die Komplexität des entsprechenden und passenden Code.

Nehmen wir als nächstes nur einen Befehl mehr:

$ echo '0'> a && echo '1'> b && echo '2'> c && ls notexist ls: Kann nicht zugreifen 'kostet nicht': Keine solche Datei oder Verzeichnis 

Dies liest jetzt viel einfacher, richtig, richtig?

Wir haben gerade einen weiteren Befehl hinzugefügt, nämlich LS existiert nicht vorausgesetzt, der Befehl vorher (und in diesem Fall die gesamte Zeile, wie alle Befehle verbunden sind && In einem kettenähnlichen Setup, bei dem ein fehlerhafter Befehl die Kette bricht und die Ausführung der Kette vollständig beendet) hat gelungen. Wie alle Befehle erfolgreich sind, die ls wird ausgeführt und ein Fehler wird als Ergebnis derselben erzeugt, da die Datei wirklich nicht existiert 🙂

Was würde also passieren, wenn wir uns einem anderen anschließen würden? && Am Ende? Würde die Befehlskette enden, wie wir sagten? Lassen Sie uns den Befehl ein wenig optimieren:

$ echo '0'> a && echo '1'> b && echo '2'> c && ls diNotexist && echo 'sicher nicht' ls: Kann nicht zugreifen ': Keine solche Datei oder Verzeichnis oder Verzeichnis oder Verzeichnis 


Und sicherlich wurde es nicht ausgeführt. Lassen Sie uns dann unseren nächsten Befehl in unserer Kette aus dem ursprünglichen Beispiel vorstellen:

$ echo '0'> a && echo '1'> b && echo '2'> c && ls macht nicht exist || LS A LS: Kann nicht zugreifen "macht nicht exist": Keine solche Datei oder Verzeichnis a 

Kannst du sehen, was passiert?? Hier haben wir ein neues Syntax -Symbol nämlich || das unterscheidet sich von && Da es nur ausgeführt wird, wenn es im vorherigen Befehl ein Ergebnis ungleich Null gab. Beachten Sie, dass beide || Und && Bewerben Sie sich nur auf den letzten Befehl und nicht auf die Befehlskette, obwohl man ihn insgesamt als Kette betrachten könnte.

Sie können also darüber nachdenken && als englischsprachiger Äquivalent Und und in gewissem Maße das Gemeinsame Und in Programmiersprachen vorhanden, aber mit der Wendung, die wir hier nach einem Zustand überprüfen && und ausführen, was dahinter steckt, vorausgesetzt, der Ausstiegsbedingung ist 0.

Eine weitere Wendung ist, dass die meisten Programmiersprachen nachsehen werden Wahrheit als binär 1 Wenn && Syntax wird verwendet. Betrachten Sie beispielsweise den Pseudocode; Wenn test1_flag && test2_flag dann… die normalerweise bewertet werden, um Gesamt wahr (und somit die ausführen Dann Befehle) Wenn die Binärflaggen test1_flag Und test2_flag sind 1 oder wahr, während in Bash Bash Wahrheit wird durch a angezeigt 0 (und nicht 1) Beenden Sie den Status aus dem letzten Befehl!

Sie können sich vorstellen || als englischsprachiger Äquivalent oder (oder wie in oder wenn dies fehlschlägt, dann tun Sie… ). In dieser Situation besteht eine stärkere Verbindung zu gemeinsamen Programmiersprachen: Wenn beispielsweise eine gemeinsame Programmsprache überprüft Wenn test1_flag || test2_flag dann… , dann ein binäres Positiv test1_flag (ich.e. Wert 1) oder test2_flag würde den Gesamtzustand ergeben, um wahr zu sein (und damit die Dann Klausel würde ausgeführt). Wir sehen dasselbe in Bash; Wenn der Ausgangscode des Befehls ungleich Null ist (i.e. 1 oder in einigen Fällen ein höherer Wert), dann der Befehl hinter dem || Klausel wird ausgeführt.

Kehren wir nun zum ursprünglichen Befehl zurück und analysieren Sie ihn vollständig:

$ echo '0'> a && echo '1'> b && echo '2'> c && ls macht nicht exist || ls a && ls b && ls c && ls d && ls e ls: Kann nicht zugreifen 'doNotexist': Keine solche Datei oder Verzeichnis A b c ls: Kann nicht zugreifen 'D': Keine solche Datei oder Verzeichnis 

Kannst du sehen, was passiert?? Weil das LS existiert nicht Der Befehl schlägt intern fehl und ergibt eine Ausgabe ungleich Null (Verwendung LS ist nicht existiert; echo $? in Bash zu überprüfen; Die Ausgabe ist 2), Die oder (||) Klausel wird ausgelöst und als nächstes führen wir aus ls. Stellen Sie es sich wie eine Kette vor, die in eine andere Richtung fließt, aber es ist immer noch eine Kette.

Als die ls a Befehl erfolgreich und folgt von dem Und (&&) Klausel, der nächste Befehl wird ausgeführt und so weiter. Beachten Sie, dass die Ausführung ankommt ls d, und die Ausgabe für dasselbe (LS: Kann nicht auf 'D' zugreifen) wird gezeigt, aber die ls e Der Befehl wird nicht ausgeführt! Dies wird erwartet, als && wurde benutzt und die ls d Befehl fehlgeschlagen. Somit, ls e wird niemals ausgeführt.

Abschluss

Je kompetenter Sie beim Schreiben von Bash-Einzeilern, desto schneller, besser, weniger fehleranfälliger und glatter werden Ihre Bash-One-Liner-Skripte und desto weniger Zeit werden Sie für das Schreiben aufgewendet. Die Entwickler der Bash -Sprache haben alle Kontrolle in Ihre Hände gelegt. Was werden Sie heute mit dieser Kontrolle machen??

Hinterlassen Sie uns eine Nachricht unten mit Ihren coolsten Ein-Liner-Kreationen!

Verwandte Linux -Tutorials:

  • Eine Einführung in Linux -Automatisierung, Tools und Techniken
  • Dinge zu installieren auf Ubuntu 20.04
  • Dinge zu tun nach der Installation Ubuntu 20.04 fokale Fossa Linux
  • Mastering -Bash -Skriptschleifen beherrschen
  • Abrufen von Webseiten mit WGet, Curl und Lynx
  • Mint 20: Besser als Ubuntu und Microsoft Windows?
  • Ubuntu 20.04 Leitfaden
  • Verschachtelte Schleifen in Bash -Skripten
  • Big Data Manipulation zum Spaß und Gewinn Teil 1
  • Dinge zu tun nach der Installation Ubuntu 22.04 Jammy Quallen…