10 Erstaunlech a mysteriéis Benotzunge vu (!) Symbol oder Bedreiwer a Linux Kommandoen


De ! Symbol oder Bedreiwer am Linux kann als Logesch Negatioun Bedreiwer benotzt ginn wéi och fir Kommandoen aus der Geschicht mat Tweaks ze sichen oder fir virdru lafen Kommando mat Modifikatioun auszeféieren. All d'Befehle hei drënner goufen explizit an Bash Shell gepréift. Och wann ech net gepréift hunn, awer e Major vun dësen wäert net an enger anerer Schuel lafen. Hei gi mir an déi erstaunlech a mysteriéis Benotzunge vum ! Symbol oder Bedreiwer a Linux Kommandoen.

Dir sidd vläicht net bewosst datt Dir e Kommando aus Ärem Geschichtsbefehl ausféiert (schonn/fréier ausgefouert Kommandoen). Fir unzefänken, fannt Dir d'Kommandonummer andeems Dir 'Geschicht' Kommando ausféiert.

$ history

Fuert elo e Kommando aus der Geschicht just duerch d'Zuel op där et erschéngt, am Ausgang vun der Geschicht. Sot e Kommando lafen deen op der Nummer 1551 am Ausgang vum 'Geschicht' Kommando erscheint.

$ !1551

An, et leeft de Kommando (Top Kommando am uewe genannte Fall), deen op der Nummer 1551 opgezielt gouf. Dëse Wee fir schonn ausgefouert Kommando ze recuperéieren ass ganz hëllefräich besonnesch am Fall vun deene Kommandoen déi laang sinn. Dir musst et just ruffen mat ![Nummer bei där et am Ausgang vum Geschichtsbefehl erscheint].

Dir kënnt dës Kommandoen ausféieren, déi Dir virdru gemaach hutt, duerch hir Lafsequenz, datt de leschte Run Kommando als -1, zweetlescht als -2, siwente lescht als -7, ... vertruede gëtt.

Éischt lafen Geschicht Kommando fir eng Lëscht vun de leschten ausgefouert Kommando ze kréien. Et ass néideg fir d'Geschichtskommando auszeféieren, sou datt Dir sécher sidd datt et kee Kommando ass wéi rm Kommando> Datei an anerer just fir sécherzestellen datt Dir kee geféierleche Kommando zoufälleg ausféiert. An dann kontrolléiert Sechsten leschte Kommando, Aacht lescht Kommando an Zéngten leschte Kommando.

$ history
$ !-6
$ !-8
$ !-10

Ech muss den Inhalt vum Verzeechnes '/home/$USER/Binary/firefox' opzielen, also hunn ech gebrannt.

$ ls /home/$USER/Binary/firefox

Dunn hunn ech gemierkt datt ech 'ls -l' sollt entloossen fir ze kucken wéi eng Datei do ausführbar ass? Also soll ech de ganze Kommando nach eng Kéier tippen! Nee ech brauch net. Ech muss just dat lescht Argument op dësen neie Kommando droen wéi:

$ ls -l !$

Hei wäert !$ Argumenter droen, déi am leschte Kommando un dësen neie Kommando passéiert sinn.

Loosst eis soen datt ech eng Textdatei 1.txt um Desktop erstallt hunn.

$ touch /home/avi/Desktop/1.txt

a kopéiert et dann op '/home/avi/Downloads'benotzt de komplette Wee op béide Säiten mam cp Kommando.

$ cp /home/avi/Desktop/1.txt /home/avi/downloads

Elo hu mir zwee Argumenter mat cp Kommando passéiert. Éischt ass '/home/avi/Desktop/1.txt'an zweet ass '/home/avi/Downloads', loosst se anescht behandelen, just echo [Argumenter] ausféieren fir béid Argumenter anescht ze drécken.

$ echo “1st Argument is : !^”
$ echo “2nd Argument is : !cp:2”

Notéiert dat 1. Argument kann als \!^” gedréckt ginn an de Rescht vun den Argumenter kënne gedréckt ginn andeems Dir \![Name_of_Command]:[Number_of_argument]” ausféiert.

Am uewe genannte Beispill war den éischte Kommando 'cp'an 2. Argument war gebraucht fir ze drécken. Dofir \!cp:2, wann e Kommando seet datt xyz mat 5 Argumenter ausgeführt gëtt an Dir musst 4. Argument kréien, kënnt Dir \!xyz:4 benotzen , a benotzt se wéi Dir wëllt. All d'Argumenter kënnen duerch \!* zougänglech ginn.

Mir kënnen de leschten ausgefouerten Kommando op Basis vu Schlësselwieder ausféieren. Mir kënnen et wéi follegt verstoen:

$ 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]

Hei hu mir deeselwechte Kommando (ls) benotzt awer mat verschiddene Schalter a fir verschidden Ordner. Ausserdeem hu mir d'Ausgab vun all Kommando op '/dev/null' geschéckt well mir net mat der Ausgab vum Kommando këmmeren, och d'Konsole bleift propper.

Féiert elo de leschte Run Kommando op Basis vu Schlësselwieder.

$ ! ls					[Command 1]
$ ! ls -l				[Command 2]	
$ ! ls -la				[Command 3]
$ ! ls -lA				[Command 4]

Préift d'Ausgab an Dir wäert iwwerrascht sinn datt Dir schonn ausgefouert Kommandoen just duerch ls Schlësselwieder leeft.

Dir kënnt Äre leschte Run Kommando ausféieren/änneren mat (!!). Et rufft de leschte Run Kommando mat Alter/Tweak am aktuellen Kommando. Loosst Iech de Szenario weisen

Leschten Dag lafen ech en One-Liner Skript fir meng privat IP ze kréien sou datt ech lafen,

$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/

Dunn hunn ech op eemol erausfonnt datt ech den Output vum uewe genannte Skript op eng Datei ip.txt muss viruleeden, also wat soll ech maachen? Soll ech de ganze Kommando nach eng Kéier aginn an d'Ausgab op eng Datei redirectéieren? Gutt eng einfach Léisung ass UP Navigatiounsschlëssel ze benotzen an > ip.txt derbäizefügen fir den Ausgang op eng Datei als.

$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/ > ip.txt

Dank dem Liewen Retter UP Navigatioun Schlëssel hei. Betruecht elo déi ënnescht Bedingung, d'nächst Kéier wann ech ënner dem One-Liner Skript lafen.

$ ifconfig | grep "inet addr:" | awk '{print $2}' | grep -v '127.0.0.1' | cut -f2 -d:

Soubal ech de Skript lafen, huet d'Bash-Prompt e Feeler mat der Noriicht zréckginn \bash: ifconfig: Kommando net fonnt, Et war net schwéier fir mech ze roden datt ech dëse Kommando als Benotzer lafen wou et soll als root lafen.

Also wat ass d'Léisung? Et ass schwéier fir op root ze aloggen an dann de ganze Kommando erëm ze tippen! Och (UP Navigatiounsschlëssel) am leschte Beispill ass net komm fir hei ze retten. Also? Mir mussen \!!” ouni Zitater ruffen, déi de leschte Kommando fir dee Benotzer ruffen.

$ su -c “!!” root

Hei ass de Switch User deen root ass, -c ass fir de spezifesche Kommando als Benotzer auszeféieren an de wichtegsten Deel !! gëtt duerch Kommando ersat a lescht Run Kommando wäert hei ersat ginn. jo! Dir musst Root Passwuert ubidden.

Ech benotzen !! meeschtens a folgenden Szenarien,

1. Wann ech lafen apt-get Kommando als normal Benotzer, Ech kréien normalerweis e Feeler gesot Dir hutt keng Erlaabnis auszeféieren.

$ apt-get upgrade && apt-get dist-upgrade

Opps Feeler ... maach der keng Suergen, fuert ënnert dem Kommando aus fir et erfollegräich ze kréien ..

$ su -c !!

Selwecht wéi ech maachen fir,

$ service apache2 start
or
$ /etc/init.d/apache2 start
or
$ systemctl start apache2

OOPS Benotzer net autoriséiert sou eng Aufgab ze droen, also lafen ech ..

$ su -c 'service apache2 start'
or
$ su -c '/etc/init.d/apache2 start'
or
$ su -c 'systemctl start apache2'

De ! (Logesch NET) kann benotzt ginn fir de Kommando op all Dateien/Extensioun auszeféieren, ausser dat ass hannert !.

A. Ewechzehuelen all d'Fichier'en aus engem Verzeechnes ausser deen den Numm vun deem ass 2.txt.

$ rm !(2.txt)

B. Ewechzehuelen all Dateityp aus dem Dossier ausser deen, wou d'Extensioun 'pdf' ass.

$ $ rm !(*.pdf)

Hei wäerte mir benotzen! -d fir ze validéieren ob de Verzeichnis existéiert oder net gefollegt vu Logical AND Operator (&&) fir ze drécken datt de Verzeichnis net existéiert a Logical OR Operator (||) fir d'Verzeechnes ze drécken ass präsent.

Logik ass, wann d'Ausgab vum [! -d /home/avi/Tecmint ] ass 0, et wäert ausféieren wat iwwer Logesch läit AN soss geet et op Logesch ODER (||) an ausféiert wat iwwer Logesch ODER läit.

$ [ ! -d /home/avi/Tecmint ] && printf '\nno such /home/avi/Tecmint directory exist\n' || printf '\n/home/avi/Tecmint directory exist\n'

Ähnlech wéi déi uewe genannte Bedingung, awer hei wann de gewënschte Verzeechnes net existéiert, gëtt de Kommando eraus.

$ [ ! -d /home/avi/Tecmint ] && exit

Eng allgemeng Implementatioun an der Skriptsprooch wou wann de gewënschte Verzeechnes net existéiert, en erstellt.

[ ! -d /home/avi/Tecmint ] && mkdir /home/avi/Tecmint

Dat ass alles fir elo. Wann Dir all aner Notzung vum ! kennt oder begéint, wat et wäert ass ze wëssen, kënnt Dir eis Äre Virschlag am Feedback ginn. Bleift verbonnen!