Quando utilizzi frequentemente la riga di comando di Linux, l'uso efficace del comando history può essere un notevole aumento della produttività.
In Linux, c'è un comando molto utile per mostrarti tutti gli ultimi comandi che sono stati usati di recente. Il comando si chiama semplicemente history
.
Visualizza timestamp
In genere quando digiti history
nella riga di comando, per impostazione predefinita vedi un numero seguito dai comandi che hai usato di recente. A scopo di controllo, può essere utile visualizzare il timestamp insieme al comando come mostrato di seguito.
Per abilitare il timestamp nella history
output del comando, è necessario configurare HISTTIMEFORMAT
Bash variabile.
export HISTTIMEFORMAT="%F %T "
history | more
1 2020-06-25 19:02:39 systemctl restart network
2 2020-06-25 19:02:43 exit
3 2020-06-25 19:02:47 id
4 2020-06-25 19:02:56 cat /etc/hosts
Cronologia comandi di ricerca
Questa potrebbe essere la funzione utilizzata più di frequente nella history
comando . Quando hai già eseguito un comando molto lungo, puoi semplicemente cercare nella cronologia utilizzando una parola chiave ed eseguire nuovamente lo stesso comando senza doverlo digitare completamente.
- Premi
Control+R
e digita la parola chiave. - Premi invio quando vedi il tuo comando, che eseguirà il comando dalla cronologia.
Nell'esempio seguente, ho cercato host
, che mostrava il comando precedente cat /etc/hosts
nella cronologia che conteneva la parola host
.
(reverse-i-search)`host': cat /etc/hosts
cat /etc/hosts
#<ip-address> <hostname.domain.org> <hostname>
127.0.0.1 localhost.localdomain localhost server1
::1 localhost.localdomain localhost server1
A volte vuoi modificare un comando dalla cronologia prima di eseguirlo. Ad esempio, puoi cercare systemctl
, che visualizzerà systemctl restart network
dalla cronologia dei comandi, selezionare questo comando (premendo ESC
chiave) e cambia il restart
per stop
.
Quindi eseguilo di nuovo premendo semplicemente Enter
.
(reverse-i-search)`systemctl': systemctl stop network
systemctl stop network
Ripeti l'ultimo comando eseguito
A volte potresti finire per ripetere i comandi precedenti per vari motivi. Di seguito sono riportati i 4 diversi modi per ripetere l'ultimo comando eseguito.
- Utilizza la
up arrow
per visualizzare il comando precedente e premere invio per eseguirlo. - Digita
!!
e premi invio dalla riga di comando - Digita
!-1
e premi invio dalla riga di comando. - Premi
Control+P
visualizzerà il comando precedente, premere invio per eseguirlo.
Esegui un comando specifico
Nell'esempio seguente, se vuoi ripetere il comando n. 4, puoi eseguire !4
come mostrato di seguito.
history | more
systemctl restart network
exit
id
cat /etc/hosts
!4
cat /etc/hosts
#<ip-address> <hostname.domain.org> <hostname>
127.0.0.1 localhost.localdomain localhost server1
::1 localhost.localdomain localhost server1
Esegui il comando precedente che inizia con una parola specifica
Digita !
seguite dalle lettere iniziali del comando che si desidera rieseguire. Nell'esempio seguente, digitando !ps
e invio, eseguito il comando precedente che inizia con ps
, che è ps aux | grep yp
.
!ps
ps aux | grep yp
root 16947 0.0 0.1 36516 1264 ? Sl 13:10 0:00 ypbind
root 17503 0.0 0.0 4124 740 pts/0 S+ 19:19 0:00 grep yp
Limita il numero di elementi della cronologia
Questo è controllato da HISTSIZE
e HISTFILESIZE
variabili della shell Bash integrate. Aggiungi le seguenti due righe al tuo ~/.bashrc
file e disconnettersi, quindi accedere nuovamente.
HISTSIZE=1500
HISTFILESIZE=1500
Di conseguenza, ora history
è impostato per memorizzare 1500 comandi.
Cambia il nome del file della cronologia
Per impostazione predefinita, history
è memorizzato in ~/.bash_history
file.
Aggiungi la seguente riga a .bash_profile
file e accedere nuovamente alla shell Bash, per memorizzare il comando della cronologia in .my_commandline
file invece di .bash_history
file.
HISTFILE=/root/.my_commandline
Questo viene utilizzato quando si desidera tenere traccia dei comandi eseguiti da terminali diversi utilizzando nomi di file di cronologia diversi.
Elimina la voce ripetuta continua dalla cronologia
Nell'esempio seguente pwd
è stato digitato tre volte, quando fai la cronologia, puoi vedere tutte e 3 le occorrenze continue di essa. Per eliminare i duplicati, imposta HISTCONTROL
a ignoredups
come mostrato di seguito.
history | tail -4
44 pwd
45 pwd
46 pwd
47 history | tail -4
export HISTCONTROL=ignoredups
history | tail -3
56 export HISTCONTROL=ignoredups
57 pwd
58 history | tail -4
Cancella i duplicati nell'intera cronologia
I ignoredups
mostrato sopra rimuove i duplicati solo se sono comandi consecutivi. Per eliminare i duplicati nell'intera cronologia, imposta il HISTCONTROL
a erasedups
come mostrato di seguito.
export HISTCONTROL=erasedups
pwd
systemctl restart network
history | tail -3
38 pwd
39 systemctl restart network
40 history | tail -3
ls -l
systemctl restart network
history | tail -6
35 export HISTCONTROL=erasedups
36 pwd
37 history | tail -3
38 ls -l
39 systemctl restart network
40 history | tail -6
Forza la cronologia a non ricordare un comando particolare
Quando esegui un comando, puoi istruire history
ignorare il comando impostando HISTCONTROL
per ignorespace
e digitando uno spazio davanti al comando come mostrato di seguito.
Vedo molti amministratori di sistema junior entusiasti di questo, poiché possono nascondere un comando dalla cronologia. È bene capire come ignorespace
lavori. Ma, come best practice, non nascondere di proposito nulla dalla cronologia.
export HISTCONTROL=ignorespace
ls -ltr
pwd
systemctl restart network #Note that there is a space at the beginning of service, to ignore this command from history
history | tail -3
67 ls -l
68 pwd
69 history | tail -3
Cancella tutta la cronologia precedente
A volte potresti voler cancellare tutta la history
precedente , ma vuoi che la cronologia vada avanti.
history -c
Parole sostitutive dai comandi della cronologia
Durante la ricerca nella history
, potresti voler eseguire un comando diverso ma utilizzare lo stesso parametro del comando che hai appena cercato.
Nell'esempio seguente, il !!:$
accanto a vi
comando ottiene l'argomento dal comando precedente al comando corrente.
ls nginx.conf
nginx.conf
vi !!:$
vi nginx.conf
Nell'esempio seguente, il !^
accanto al comando vi ottiene il primo argomento dal comando precedente (cioè cp
comando) al comando corrente (cioè vi
comando).
cp nginx.conf nginx.conf.bak
vi !^
vi nginx.conf
Sostituisci un argomento specifico con un comando specifico
Nell'esempio seguente, !cp:2
cerca il comando precedente nella cronologia che inizia con cp e prende il secondo argomento di cp e lo sostituisce con il comando ls -l come mostrato di seguito.
cp ~/longname.txt /really/a/very/long/path/long-filename.txt
ls -l !cp:2
ls -l /really/a/very/long/path/long-filename.txt
Nell'esempio seguente, !cp:$
cerca il comando precedente nella cronologia che inizia con cp e prende l'ultimo argomento (in questo caso, che è anche il secondo argomento come mostrato sopra) di cp e lo sostituisce con il comando ls -l come mostrato di seguito.
ls -l !cp:$
ls -l /really/a/very/long/path/long-filename.txt
Disabilita l'utilizzo della cronologia
Se vuoi disabilitare la history
tutti insieme e non vuoi che la shell Bash ricordi i comandi che hai digitato, imposta il HISTSIZE
a 0 come mostrato di seguito.
export HISTSIZE=0
Ignora comandi specifici dalla cronologia
A volte potresti non voler ingombrare la cronologia con comandi di base come pwd
e ls
. Usa HISTIGNORE
per specificare tutti i comandi che vuoi ignorare dalla cronologia.
Tieni presente che l'aggiunta di ls
al HISTIGNORE
ignora solo ls
e non ls -l
. Quindi, devi fornire il comando esatto che vorresti ignorare dalla cronologia.
export HISTIGNORE="pwd:ls:ls -ltr:"
pwd
ls
ls -l
systemctl restart network
history | tail -3
79 export HISTIGNORE="pwd:ls:ls -l:"
80 systemctl restart network
81 history
[Note that history did not record pwd, ls and ls -l]
Per ulteriori informazioni sulla history
comando in Linux, consulta la sua pagina del manuale.