En mi artículo, Parsing Bash history, demostré cómo hacer referencia a elementos en su shell history
tanto por número de línea como por posición de palabra. Una vez que haya dominado el análisis de Bash history
por índice de línea y palabra, puede beneficiarse de los modificadores disponibles para el history
comando.
La opción de shell histexpand
Antes de discutir history
análisis, vale la pena mencionar que el signo de exclamación (!
) la notación solo está disponible para su shell Bash gracias a histexpand
opción. Porque histexpand
está habilitado de forma predeterminada, muchos usuarios nunca le dan mucha consideración. Sin embargo, es la opción que fuerza la expansión de un !
a la lista de history
entradas.
Si la opción se desactiva, perderá esta funcionalidad. Por ejemplo:
$ echo foo
$ set +o histexpand
$ !-2
bash: !-2: command not found
$ set -o histexpand
$ !-3
echo foo
foo
Generalmente, histexpand
está activado de forma predeterminada, excepto en shells no interactivos (por ejemplo, en un script de shell). Debería history
la taquigrafía te falla, puedes activar histexpand
como una opción de shell o usar el history
completo comando implícito en histexpand
:
$ echo foo
$ set +o histexpand
$ history -p !-2
echo foo
foo
En un script de shell, debe activar history
y proporcione una ubicación donde history
se puede guardar:
HISTFILE=/tmp/history.log
set -o histexpand
set -e
## some code here
## clean up
rm /tmp/history.log
Una ventaja de dejar histexpand
desactivado es que se pierde la verbosidad de los resultados del history
comportamiento. Por ejemplo, con histexpand
activado, lo primero que regresa a su shell después de un history
comando es la versión ampliada de lo que se está ejecutando:
$ set -o histexpand
$ echo foo
foo
$ !!
echo foo
foo
Con histexpand
desactivado, su history
El comando es más largo, pero los resultados son más concisos:
$ set +o histexpand
$ echo foo
foo
$ !!
foo
Si encuentra un uso para history
en un script de shell depende de ti, pero history
los modificadores tienen algunos atajos interesantes que los hacen particularmente convenientes en algunos casos.
Modificadores de historial
Modificadores al history
las selecciones se designan con dos puntos (:
) seguido de un carácter modificador. Algunos modificadores pueden combinarse con otros.
Sufijo de nombre de archivo
Para eliminar el sufijo de un argumento, use r
modificador.
Esto es similar 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
El r
modificador no es súper inteligente. Simplemente encuentra el punto final en un nombre de archivo y corta el sufijo, que a veces puede no coincidir con lo que usted piensa que es el sufijo del archivo, por lo que, de alguna manera, basename
ofrece mayor flexibilidad.
$ set +o histexpand
$ ls -lgGh aLongFileNameWith-a_complex-syntax-1.tar.gz
$ echo !!:2:r
aLongFileNameWith-a_complex-syntax-1.tar
El resultado opuesto se puede lograr con el e
modificador:
$ set +o histexpand
$ echo aLongFileNameWith-a_complex-syntax-1.tgz
aLongFileNameWith-a_complex-syntax-1.tgz
$ echo !!:2:e
.tgz
Nombres de archivo
Una versión simple de dirname
está disponible con el h
modificador:
$ set +o histexpand
$ echo src/spacer.sh
src/spacer.sh
$ echo !!^:h
src
Y el otro lado de esa expresión está disponible con t
modificador:
$ set +o histexpand
$ echo src/spacer.sh
src/spacer.sh
$ echo !!^:t
spacer.sh
Sustitución de cadenas
Posiblemente el modificador más ampliamente útil de history
es sustitución de cadenas. Por ejemplo, cualquier administrador de un entorno mixto ha escrito esto en un cuadro de Red Hat Enterprise Linux en algún momento:
$ sudo apt install tmux
Tal error es fácil de corregir con la sustitución de cadenas:
$ ^apt^dnf
sudo dnf install tmux
Incluso puede agregar algunas opciones:
$ ^apt^dnf -y
sudo dnf -y install tmux
Esta history
la sintaxis es una forma abreviada de s
modificador La sintaxis completa es, por ejemplo, !!:s/apt/dnf
y, por lo tanto, puede ser útil para elementos varias líneas atrás en su history
. Suponga que emitió un comando útil tres comandos atrás y desea ejecutar un comando similar ahora:
$ !-3:s/vi/emacs/
sudo dnf install -y emacs
Me gusta sed
, esta sustitución por defecto solo ocurre una vez, pero puede hacerla global (en relación con la línea que está recuperando) con g
modificador:
$ pip update pip
[...]
$ !!:gs:/pip/pip3/
pip3 update pip3
La seguridad es lo primero:cómo realizar un simulacro de historial
Presionando Return
después de un history
modificado line a veces puede ser estresante, especialmente cuando la línea que desea volver a ejecutar se encuentra entre comandos particularmente peligrosos o afecta archivos importantes. Si desea verificar el comando que está a punto de modificar y ejecutar, puede usar el p
modificador al final de un history
modificación.
$ !-32:0-:s/mv/trash/:p
trash important.txt status.txt pay.txt
El comando que ve como resultado es el elemento expandido de history
, pero aún no se ha ejecutado. Puede ejecutarlo manualmente, presionando el Up
flecha o Ctrl+P
, ahora que se ha resuelto para usted. Usando la verificación (p
) suele ser una buena idea si eres nuevo en el uso del history
comando en producción.
Conclusión
Su historial de Bash puede ser útil para muchas cosas, ya sea para revisar lo que ha estado haciendo todo el día o simplemente para hacer que su trabajo sea más eficiente al reutilizar fragmentos de información en los que ya ha trabajado para resolver. Cuanto más practique con los modificadores de historial, más útiles se volverán. Permítase (cuidadosamente) tropezar con algunos a medida que aprende la sintaxis, y pronto recordará comandos y argumentos con menos pulsaciones de teclas que nunca.
[ ¿Quiere probar Red Hat Enterprise Linux? Descárgalo ahora gratis. ]