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
Stampa i comandi
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.]