GNU/Linux >> Linux Esercitazione >  >> Linux

Comandi Bash bang:un trucco da conoscere per la riga di comando di Linux

Non dimenticare mai di emettere sudo prima di un comando? Hai mai dovuto ripetere un intero comando perché avevi un errore di battitura? Hai mai pensato che sarebbe bello avere scorciatoie per ripetere i comandi precedenti? Se suona come te, ho qualcosa da condividere. In questo articolo, ti mostrerò come usare bash bang (! ) comandi, che semplificano la ripetizione dei comandi e la correzione degli errori.

Nozioni di base sulla ripetizione dei comandi

Bash fornisce l'accesso all'elenco dei comandi precedentemente emessi, noto come cronologia dei comandi. Il valore di HISTSIZE variabile imposta il numero di comandi che vengono salvati nell'elenco della cronologia. Per impostazione predefinita, questo valore è 500. Questi comandi emessi in precedenza (noti come elenco della cronologia) sono archiviati nel file della cronologia. La sua posizione predefinita è ~/.bash_history e questa posizione è memorizzata nella variabile della shell HISTFILE .

Sotto il cofano, i comandi bang (!) introducono i comandi dall'elenco della cronologia di bash nel flusso di input. Questa funzione semplifica la ripetizione dei comandi, la sostituzione del testo, la manipolazione degli argomenti e la correzione rapida di errori di battitura nei comandi precedenti.

Esempi di ripetizione dei comandi

Ecco alcuni esempi di cosa puoi fare con bash bang.

Ripeti l'ultimo comando che corrisponde all'inizio di una stringa

Il botto (! ) seguito dal primo carattere (o stringa) corrispondente al comando che desideri eseguire ripeterà l'istanza più recente di quel comando:

$ 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

Ripeti l'ultimo comando corrispondente in qualsiasi punto di una stringa

Il !?<string> format fa lo stesso di quanto sopra, ma <string> non deve essere necessariamente all'inizio del comando:

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

Ripeti il ​​comando n dalla cronologia

Ripetere il comando n dalla cronologia di bash (conto alla rovescia dall'alto) è semplice come usare un botto con il numero in questione:

!10

Ripeti l'ennesimo comando dall'ultima voce della cronologia

Ripetere il comando n dalla cronologia di bash (contando dal basso) è semplice come usare un botto con un segno meno e il numero in questione:

!-10

Ripeti l'ultimo comando

Se c'è un comando bang che uso sempre, sarebbe !! . Il botto (!! ) il comando ripete l'ultimo comando dall'elenco della cronologia, comportandosi come !-1 :

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

Bang-bang (!! ) è utile quando devi ripetere il comando precedente, o se devi anteporre sudo o output pipe:

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

Ripeti ma sostituisci una stringa

Spesso emetto comandi lunghi e li riinvio con interruttori diversi. Oppure, devo emettere nuovamente un comando perché si è verificato un errore di battitura nel mio comando precedente. La sostituzione di stringhe mi consente di farlo senza riscrivere l'intero comando lungo.

Ci sono due modi in cui possiamo ottenere questo risultato. Uno è usando:

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

Questa struttura sostituisce una stringa al comando precedente:

$ 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

Puoi anche fare lo stesso con !<string>:s^<old>^<new> :

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

Questa opzione è utile quando devi eseguire la sostituzione di stringhe per un comando che non era il più recente.

L'altro modo in cui possiamo ottenere questo risultato è attraverso la struttura ^<old>^<new> . Questo formato sostituisce le stringhe per il comando più recente, simile a !!: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 $ 

Ripeti gli argomenti dei comandi

Spesso utilizziamo gli stessi argomenti di un comando precedente. Se hai una lunga discussione, probabilmente vorrai ripeterla con il comando successivo. Diamo un'occhiata ad alcuni comandi bash bang che possono farlo per noi.

Innanzitutto, il formato !:n ripete l'argomento n del comando precedente, con 0 essendo il comando stesso:

~/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

Secondo, !!:$ ripete l'ultimo argomento del comando precedente. Puoi abbreviare questo comando in !$ e $_ :

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

Potresti chiedere:"E se volessi usare questa tecnica con un comando che ho emesso in precedenza, ma non il più recente?" Puoi farlo con i comandi bang, usando uno dei seguenti:

!<command you've issued previously >:$ 

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

oppure:

!<command you've issued previously >:n

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

A volte potresti voler stampare il comando, ma non vuoi che venga eseguito. Puoi portare a termine questa attività con !:p :

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

In effetti, puoi stampare qualsiasi comando nell'elenco della cronologia senza eseguirlo. Emetti solo uno dei seguenti:

$ !<command>:p

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

$ !<string>:p

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

Richiama i comandi con reverse-i-search

Come amministratore di sistema, probabilmente emetti centinaia di comandi ogni giorno. Potresti avere difficoltà a richiamare alcuni comandi o a richiamarne una parte. Ecco un'altra opzione per trovare quella che ti serve.

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

CTRL+R attiva reverse-i-search , che fornisce una bella area di ricerca, offrendoti un modo più semplice per navigare nella cronologia.

Conclusione

Questi sono utili bash bang (! ) comandi con cui ogni amministratore di sistema dovrebbe avere familiarità. Questi comandi fanno risparmiare un sacco di tempo e ti danno la possibilità di correggere rapidamente gli errori di comando. Leggi di più su bash nella sua pagina man, con il comando man bash .

[Vuoi provare Red Hat Enterprise Linux? Scaricalo ora gratuitamente.]


Linux
  1. 8 suggerimenti per la riga di comando di Linux

  2. Suggerimenti Bash per tutti i giorni dalla riga di comando

  3. Yoda:l'assistente personale della riga di comando per il tuo sistema Linux

  4. 8 sottocomandi Linux virsh per la gestione delle VM sulla riga di comando

  5. Nozioni di base sulla riga di comando di Linux:esecuzione di comandi dalla riga di comando

Ripgrep – Lo strumento di ricerca da riga di comando più veloce per Linux

I 40 comandi utili del server Linux per principianti e professionisti

I 50 comandi IP utili di Linux per gli amministratori di rete

5 comandi per visualizzare il contenuto di un file nella riga di comando di Linux

Pratici comandi Tee Linux e Unix per l'amministratore Linux

Quattro browser Web per la riga di comando di Linux