10 usi sorprendenti e misteriosi di (!) Simbolo o operatore nei comandi di Linux

()

Il '!'simbolo o l’operatore in Linux può essere utilizzato come operatore di negazione logica , nonché per recuperare comandi dalla cronologia con modifiche o per eseguire comandi eseguiti in precedenza con modifiche. Tutti i comandi seguenti sono stati controllati esplicitamente in bash Shell. Anche se non ho controllato, ma uno di questi non verrà eseguito in un’altra shell. Qui entriamo negli usi sorprendenti e misteriosi del '!'simbolo o dell’operatore nei comandi di Linux.

1. Eseguire un comando dalla cronologia per numero di comando.

Potresti non essere consapevole del fatto che puoi eseguire un comando dal tuo comando di cronologia (comandi già / eseguiti in precedenza). Per iniziare, trova prima il numero del comando eseguendo il comando ‘ history ‘.

$ history
Trova gli ultimi comandi eseguiti con il comando Cronologia

Ora esegui un comando dalla cronologia solo per il numero in cui appare, nell’output di history . Supponiamo di eseguire un comando che appare al numero 1551 nell’output del comando ” storia “.

$!1551
Esegui gli ultimi comandi eseguiti per numero ID

E, esegue il comando ( top command nel caso precedente), che era elencato al numero 1551 . Questo modo per recuperare il comando già eseguito è molto utile specialmente nel caso di quei comandi che sono lunghi. Devi solo chiamarlo usando ![Numero in cui appare nell’output del comando history] .

2. Eseguire il comando eseguito in precedenza come secondo ultimo comando, settimo ultimo comando, ecc.

Puoi eseguire quei comandi che hai eseguito in precedenza dalla loro sequenza di esecuzione essendo l’ultimo comando di esecuzione sarà rappresentato come -1 , penultimo come -2 , settimo come -7 ,….

Prima esecuzione del comando cronologia per ottenere un elenco dell’ultimo comando eseguito. È necessario eseguire il comando cronologia , in modo che tu possa essere sicuro che non ci siano comandi simili rm command > filee altri solo per assicurarti di non eseguire accidentalmente alcun comando pericoloso. E poi seleziona il sesto ultimo comando, l’ottavo ultimo comando e il decimo ultimo comando.

$ history
$ !-6
$ !-8
$!-10
Esegui gli ultimi comandi eseguiti per numero
Esegui gli ultimi comandi eseguiti per numero
3. Passa gli argomenti dell’ultimo comando che eseguiamo al nuovo comando senza ridigitare

Ho bisogno di elencare il contenuto della directory ” /home/$USER/Binary/firefox ” quindi ho sparato.

$ ls /home/$USER/Binary/firefox

Poi mi sono reso conto che avrei dovuto sparare ‘ ls -l ‘ per vedere quale file è eseguibile lì? Quindi dovrei digitare di nuovo l’intero comando! No non ho bisogno. Ho solo bisogno di portare l’ultimo argomento a questo nuovo comando come:

$ ls -l !$

Qui !$trasporterà gli argomenti passati nell’ultimo comando a questo nuovo comando.

Passa gli argomenti dell'ultimo comando eseguito a Nuovo
Passa gli argomenti dell’ultimo comando eseguito a Nuovo
4. Come gestire due o più argomenti usando (!)

Diciamo che ho creato un file di testo 1.txt sul desktop.

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

e quindi copialo in ” /home/avi/Downloads ” utilizzando il percorso completo su entrambi i lati con il comando cp .

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

Ora abbiamo passato due argomenti con il comando cp . Il primo è ” /home/avi/Desktop/1.txt ” e il secondo è ” /home/avi/Downloads “, gestiamoli in modo diverso, basta eseguire echo [arguments]per stampare entrambi gli argomenti in modo diverso.

$ echo “Il primo argomento è: !^”
$ echo “Il secondo argomento è: !cp:2”

Nota Il primo argomento può essere stampato come “!^”e il resto degli argomenti può essere stampato eseguendo “![Name_of_Command]:[Number_of_argument]”.

Nell’esempio sopra il primo comando era ” cp ” e il secondo argomento era necessario per stampare. Quindi “!cp:2”, se un comando dice che xyz viene eseguito con 5 argomenti e devi ottenere il quarto argomento, puoi usare “!xyz:4”e usarlo come preferisci. Tutti gli argomenti sono accessibili da “!*”.

Gestire due o più argomenti
Gestire due o più argomenti
5. Esegui l’ultimo comando in base alle parole chiave

Possiamo eseguire l’ultimo comando eseguito sulla base di parole chiave. Possiamo capirlo come segue:

$ ls /home > /dev/null [Comando 1]
$ ls -l /home/avi/Desktop > /dev/null [Comando 2]	
$ ls -la /home/avi/Download > /dev/null [Comando 3]
$ ls -lA /usr/bin > /dev/null [Comando 4]

Qui abbiamo usato lo stesso comando (ls) ma con opzioni diverse e per cartelle diverse. Inoltre abbiamo inviato l’output di ogni comando a ‘ /dev/null ‘ poiché non ci occuperemo dell’output del comando anche la console rimane pulita.

Ora Esegui l’ultimo comando di esecuzione sulla base delle parole chiave.

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

Controlla l’output e rimarrai stupito dal fatto che stai eseguendo comandi già eseguiti solo per ls parole chiave.

Esegui comandi basati su parole chiave
Esegui comandi basati su parole chiave
6. Il potere di !! Operatore

Puoi eseguire/modificare il tuo ultimo comando di esecuzione usando (!!). Chiamerà l’ultimo comando di esecuzione con altera/tweak nel comando corrente. Ti mostriamo lo scenario

L’ultimo giorno eseguo uno script one-liner per ottenere il mio IP privato, quindi corro,

$ ip addr mostra | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{stampa $2}' | taglia -f1 -d/

Poi all’improvviso ho capito che dovevo reindirizzare l’output dello script sopra su un file ip.txt , quindi cosa dovrei fare? Devo ridigitare di nuovo l’intero comando e reindirizzare l’output su un file? Bene, una soluzione semplice è usare il UPtasto di navigazione e aggiungere '> ip.txt'per reindirizzare l’output a un file come.

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

Grazie al UPtasto di navigazione Salvavita qui. Ora considera la condizione seguente, la prossima volta che corro sotto uno script a una riga.

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

Non appena eseguo lo script, il prompt di bash ha restituito un errore con il messaggio “bash: ifconfig: command not found”, Non è stato difficile per me indovinare di aver eseguito questo comando come utente dove dovrebbe essere eseguito come root.

Allora qual è la soluzione? È difficile accedere a root e quindi digitare di nuovo l’intero comando! Inoltre ( tasto di navigazione SU ) nell’ultimo esempio non è venuto in soccorso qui. Così? Dobbiamo chiamare “!!”senza virgolette, che chiamerà l’ultimo comando per quell’utente.

$ su -c “!!” radice

Qui su è switch user che è root, -cè eseguire il comando specifico come utente e la parte più importante !!verrà sostituita dal comando e l’ultimo comando di esecuzione verrà sostituito qui. Sì! Devi fornire la password di root.

Il potere di !!  Chiave
Il potere di !! Chiave

Faccio uso !!principalmente nei seguenti scenari,

1. Quando eseguo il comando apt-get come utente normale, di solito ricevo un errore che dice che non hai il permesso di eseguire.

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

Errore Opps … non preoccuparti, esegui il comando seguente per farlo funzionare correttamente ..

$ su -c !!

Nello stesso modo in cui lo faccio per,

$ service apache2 start
o
$ /etc/init.d/apache2 start
o
$ systemctl avvia apache2

OOPS Utente non autorizzato a svolgere tale compito, quindi corro..

$ su -c 'inizio servizio apache2'
o
$ su -c '/etc/init.d/apache2 start'
o
$ su -c 'systemctl avvia apache2'
7. Esegui un comando che influisca su tutto il file tranne ![FILE_NAME]

Il !Logical NOT ) può essere utilizzato per eseguire il comando su tutti i file/estensione tranne che è dietro '!'.

R. Rimuovere tutti i file da una directory tranne quello il cui nome è 2.txt .

$ rm !(2.txt)

B. Rimuovere tutti i tipi di file dalla cartella tranne quello la cui estensione è ” pdf “.

$ $ rm !(*.pdf)
8. Controlla se una directory (diciamo /home/avi/Tecmint) esiste o no? Printf se la suddetta directory esiste o meno.

Qui useremo '! -d'per convalidare se la directory esiste o meno, seguita dall’operatore AND logico (&&)per stampare che la directory non esiste e dall’operatore OR logico (||)per stampare la directory è presente.

La logica è che, quando l’output di [ ! -d /home/avi/Tecmint ]è 0 , eseguirà ciò che si trova oltre Logical AND altrimenti andrà in Logical OR (||)ed eseguirà ciò che si trova oltre Logical OR .

$[! -d /home/avi/Tecmint ] && printf '\nnessuna directory /home/avi/Tecmint esiste\n' || printf '\n/home/avi/La directory di Tecmint esiste\n'
9. Controlla se una directory esiste o no? In caso contrario, uscire dal comando.

Simile alla condizione precedente, ma qui se la directory desiderata non esiste, uscirà dal comando.

$[! -d /home/avi/Tecmint ] && esci
10. Crea una directory (diciamo test) nella tua home directory se non esiste.

Un’implementazione generale in Scripting Language in cui se la directory desiderata non esiste, ne creerà una.

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

È tutto per ora. Se conosci o ti imbatti in qualsiasi altro uso di '!'cui vale la pena conoscere, potresti fornirci il tuo suggerimento nel feedback. 

/ 5
Grazie per aver votato!

How useful was this post?

Click on a star to rate it!

Average rating / 5. Vote count:

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?