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. ]