Uso de modificadores de palabras con el historial de Bash en Linux

En mi artículo, Analizar el historial de Bash, mostré cómo hacer referencia a elementos en tu 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 línea y índice de palabras, puede aprovechar los modificadores disponibles para el history pedido.

La opción de shell hisexpand

antes de discutir history análisis, cabe mencionar que el signo de exclamación (!) la notación solo está disponible para su shell Bash gracias a la histexpand opción. Porque histexpand está habilitado de forma predeterminada, muchos usuarios nunca le prestan mucha atención. Sin embargo, es la opción la que impone la ampliación de un ! a la lista de history entradas.

Si la opción está deshabilitada, pierde esta funcionalidad. Por ejemplo:

$ echo foo
$ set +o histexpand
$ !-2
bash: !-2: command not found
$ set -o histexpand
$ !-3
echo foo
foo

En general, histexpand está habilitado de forma predeterminada, excepto en shells no interactivos (por ejemplo, en un script de shell). Deberían history la taquigrafía nunca te falla, puedes habilitar histexpand como una opción de shell o use la versión completa history mandato implícito en histexpand:

$ echo foo
$ set +o histexpand
$ history -p !-2
echo foo
foo

En un script de shell, debe habilitar history y proporcionar un lugar donde history puede ser salvado:

HISTFILE=/tmp/history.log
set -o histexpand
set -e

## some code here

## clean up
rm /tmp/history.log

Una ventaja de histexpand discapacitado es que se pierde la verbosidad de los resultados de history Comparte. Por ejemplo, con histexpand habilitado, lo primero que regresa a su shell después de un history El comando es la versión extendida 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

Ya sea que encuentre un uso para history en un script de shell depende de usted, pero history Los modificadores tienen algunos atajos interesantes que los hacen especialmente útiles en algunos casos.

Modificadores de historial

modificadores de history las selecciones se indican con dos puntos (:) seguido de un carácter modificador. Algunos modificadores se pueden combinar con otros.

Sufijo de nombre de archivo

Para eliminar el sufijo de un argumento, utilice el 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 muy inteligente. Simplemente encuentra el punto final en un nombre de archivo y corta el sufijo, que a veces puede no coincidir con lo que cree que es el sufijo del archivo, por lo que, de alguna manera, basename ofrece una 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 contrario se puede obtener 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 simplificada 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 esta expresión está disponible con el t modificador:

$ set +o histexpand
$ echo src/spacer.sh
src/spacer.sh
$ echo !!^:t
spacer.sh

Sustitución de cadenas

Quizás el modificador más útil de history es sustitución de cadenas. Por ejemplo, cualquier administrador en un entorno mixto ha escrito esto en un cuadro de Red Hat Enterprise Linux en algún momento:

$ sudo apt install tmux

Tal error se corrige fácilmente con una sustitución de cadena:

$ ^apt^dnf
sudo dnf install tmux

Incluso puedes agregar algunas opciones:

$ ^apt^dnf -y
sudo dnf -y install tmux

Este history la sintaxis es una abreviatura de s modificador La sintaxis completa es, por ejemplo, !!:s/apt/dnf y por lo tanto puede ser útil para elementos ubicados varias líneas en su history. Suponga que ejecutó un comando útil hace tres comandos y desea ejecutar un comando similar ahora:

$ !-3:s/vi/emacs/
sudo dnf install -y emacs

Me gusta sed, esta sustitución predeterminada solo ocurre una vez, pero puede hacerla global (en relación con la línea que está recuperando) con el g modificador:

$ pip update pip
[...]
$ !!:gs:/pip/pip3/
pip3 update pip3

La seguridad es lo primero: cómo realizar una prueba de historial

Prensado Return después de un cambio history La línea 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 editar y ejecutar, puede usar el p modificador al final de un history cambio.

$ !-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 la tecla Up flecha o Ctrl+P, ahora que se ha solucionado para usted. Usando la verificación (p) es generalmente una buena idea si es nuevo en el uso history orden de fabricación.

Índice

Envoltura

Su historial de Bash puede ser útil para muchas cosas, desde revisar lo que ha estado haciendo todo el día hasta simplemente hacer que su trabajo sea más eficiente al reutilizar fragmentos de información que ya ha trabajado para comprender. . Cuanto más practique con los modificadores de historial, más útiles se volverán. Permítase tropezar (con cuidado) con algunos a medida que aprende la sintaxis, y pronto recordará comandos y argumentos con menos pulsaciones de teclas que nunca.

Artículos de interés

Subir