Nel mio articolo, Analisi della cronologia di Bash, ho dimostrato come fare riferimento agli elementi nella history
della shell per numero di riga e per posizione della parola. Dopo aver imparato l'analisi della history
di Bash per riga e indice di parola, puoi beneficiare dei modificatori disponibili per la history
comando.
L'opzione della shell istexspan
Prima di discutere della history
analisi, vale la pena ricordare che il punto esclamativo (!
) la notazione è disponibile solo per la tua shell Bash grazie a histexpand
opzione. Perché histexpand
è abilitato per impostazione predefinita, molti utenti non ci tengono mai molto in considerazione. Tuttavia, è l'opzione che impone l'espansione di un !
all'elenco della history
voci.
Se l'opzione è disattivata, perdi questa funzionalità. Ad esempio:
$ echo foo
$ set +o histexpand
$ !-2
bash: !-2: command not found
$ set -o histexpand
$ !-3
echo foo
foo
In genere, histexpand
è attivo per impostazione predefinita, tranne che nelle shell non interattive (ad esempio, in uno script di shell). Dovrebbe history
la stenografia non ti delude mai, puoi attivare histexpand
come opzione della shell oppure usa la history
completa comando implicito da histexpand
:
$ echo foo
$ set +o histexpand
$ history -p !-2
echo foo
foo
In uno script di shell, devi attivare history
e fornisci una posizione in cui history
può essere salvato:
HISTFILE=/tmp/history.log
set -o histexpand
set -e
## some code here
## clean up
rm /tmp/history.log
Un vantaggio di lasciare histexpand
disattivato è che perdi la verbosità dei risultati di history
Azioni. Ad esempio, con histexpand
attivato, la prima cosa è tornata alla tua shell dopo una history
command è la versione estesa di ciò che viene eseguito:
$ set -o histexpand
$ echo foo
foo
$ !!
echo foo
foo
Con histexpand
disattivato, la tua history
il comando è più lungo, ma i risultati sono più concisi:
$ set +o histexpand
$ echo foo
foo
$ !!
foo
Se trovi un uso per history
in uno script di shell dipende da te, ma history
i modificatori hanno alcune scorciatoie interessanti che li rendono particolarmente convenienti in alcuni casi.
Modificatori della cronologia
Modificatori alla history
le selezioni sono contrassegnate da due punti (:
) seguito da un carattere modificatore. Alcuni modificatori possono essere combinati con altri.
Suffisso del nome file
Per eliminare il suffisso di un argomento, usa r
modificatore.
È simile a basename
.
$ ls -lgGh aLongFileNameWith-a_complex-syntax-1.tgz
-rw-r--r-- 1 0 Mar 9 11:23 aFileNameWith-a_complex-syntax-1.rev.tgz
$ echo !!:2:r
echo aLongFileNameWith-a_complex-syntax-1
aLongFileNameWith-a_complex-syntax-1
Il r
modificatore non è super intelligente. Trova semplicemente il punto finale in un nome di file e taglia il suffisso, che a volte potrebbe non corrispondere a quello che pensi come il suffisso del file, quindi in qualche modo, basename
offre una maggiore flessibilità.
$ set +o histexpand
$ ls -lgGh aLongFileNameWith-a_complex-syntax-1.tar.gz
$ echo !!:2:r
aLongFileNameWith-a_complex-syntax-1.tar
Il risultato opposto può essere ottenuto con il e
modificatore:
$ set +o histexpand
$ echo aLongFileNameWith-a_complex-syntax-1.tgz
aLongFileNameWith-a_complex-syntax-1.tgz
$ echo !!:2:e
.tgz
Nomi di file
Una versione semplice di dirname
è disponibile con il h
modificatore:
$ set +o histexpand
$ echo src/spacer.sh
src/spacer.sh
$ echo !!^:h
src
E l'altro lato di quell'espressione è disponibile con t
modificatore:
$ set +o histexpand
$ echo src/spacer.sh
src/spacer.sh
$ echo !!^:t
spacer.sh
Sostituzione di stringhe
Forse il modificatore più ampiamente utile di history
è la sostituzione di stringhe. Ad esempio, qualsiasi amministratore di un ambiente misto ha digitato questo in un box di Red Hat Enterprise Linux a un certo punto:
$ sudo apt install tmux
Un tale errore è facile da correggere con la sostituzione di stringhe:
$ ^apt^dnf
sudo dnf install tmux
Puoi anche aggiungere alcune opzioni:
$ ^apt^dnf -y
sudo dnf -y install tmux
Questa history
la sintassi è un'abbreviazione per s
modificatore. La sintassi completa è, ad esempio, !!:s/apt/dnf
e quindi può essere utile per elementi di diverse righe nella tua history
. Supponiamo che tu abbia emesso un comando utile tre comandi indietro e desideri eseguire un comando simile ora:
$ !-3:s/vi/emacs/
sudo dnf install -y emacs
Come sed
, questa sostituzione di default avviene una sola volta, ma puoi renderla globale (in relazione alla riga che stai richiamando) con il g
modificatore:
$ pip update pip
[...]
$ !!:gs:/pip/pip3/
pip3 update pip3
La sicurezza prima di tutto:come eseguire una corsa a secco cronologica
Premendo Return
dopo una history
modificata line a volte può essere stressante, specialmente quando la riga che si desidera rieseguire è annidata tra comandi particolarmente pericolosi o interessa file importanti. Se vuoi verificare il comando che stai per modificare ed eseguire, puoi utilizzare il p
modificatore alla fine di una history
modifica.
$ !-32:0-:s/mv/trash/:p
trash important.txt status.txt pay.txt
Il comando che vedi come risultato è l'elemento espanso da history
, ma non è stato ancora eseguito. Puoi eseguirlo manualmente, premendo il tasto Up
freccia o Ctrl+P
, ora che è stato risolto per te. Utilizzo della verifica (p
) è generalmente una buona idea se non conosci l'uso della history
comando in produzione.
Conclusione
La cronologia di Bash può essere utile per molte cose, che si tratti di guardare indietro a ciò che hai fatto tutto il giorno o semplicemente di rendere il tuo lavoro più efficiente riutilizzando frammenti di informazioni che hai già lavorato per capire. Più ti eserciti con i modificatori di cronologia, più utili diventano. Consenti a te stesso di inciampare (con attenzione) in alcuni mentre impari la sintassi e presto richiamerai comandi e argomenti con meno pressioni di tasti che mai.
[ Vuoi provare Red Hat Enterprise Linux? Scaricalo ora gratuitamente. ]