solía
history | less
para obtener las líneas de comandos anteriores y de los números en el lado izquierdo, encontré la línea que quería repetir (por ejemplo, 22) e hice
!22
en el símbolo del sistema y funcionó, ejecutando el conjunto de comandos en la línea que hice en ese momento. No puedo entender dónde se usa el signo de exclamación, qué representa en términos de acciones tomadas por bash y dónde usarlo. De la documentación no veo una explicación que sea 'tangible'.
Respuestas:
!
es una característica que apareció originalmente en el shell C , en los días anteriores a la posibilidad de contar con terminales para tener teclas de flecha. Es especialmente útil si agrega el número de comando actual al prompt (PS1="\!$ "
) para que pueda mirar rápidamente su pantalla para obtener números de comandos anteriores.Ahora que puede usar las teclas de flecha y cosas como Ctrl-Rbuscar en el historial de comandos, no veo mucho uso para la función.
Una variante de la que aún puede encontrar útil es la
!!
que vuelve a ejecutar el comando anterior. Por sí solo, no encuentro !!Enternada más rápido que solo ↑ Enter, pero puede ser útil cuando se combina en un comando más grande.Ejemplo: Un error piloto común en los
sudo
sistemas basados es olvidar elsudo
prefijo en un comando que requiere privilegios adicionales. Un novato vuelve a escribir todo el comando. El estudiante diligente edita el comando desde el historial de comandos del shell. El iluminado escribesudo !!
.Bash le permite deshabilitar el
!
procesamiento en el shell conset +o histexpand
oset +H
. Puede deshabilitarlo en Zsh conset -K
.fuente
sudo
o algo), puede hacerlosudo !!
, por ejemplo. Eso podría ser un poco más rápido que "Arriba / Ctrl-A (o Inicio, si tienes la suerte) / sudo / space / enter". YMMV. :)echo 'Hi!'
oecho "Hi!"
oecho Hi\!
. Todos hacen lo mismo.setopt NO_BANG_HIST
en zsh podría ser más memorable que-K
.Si no hay una respuesta más larga aquí, ciertamente hay una en Super Usuario, ya que he leído una recientemente. En la página de manual de bash puedes encontrar una gran sección titulada HISTORY EXPANSION sobre el tema.
Puede hacer un host completo más que simplemente ejecutar el último comando, o el número de comando X. Puede hacer cosas como
!cat
ejecutar el último comando que comenzó concat
. O!?bash?:s/bash/csh/
ejecuta el último comando que contienebash
pero lo reemplaza concsh
.fuente
!!:s/bash/csh/
en realidad ejecuta el último comando , luego reemplaza bash con csh, si está presente. No es el último comando que incluyó bash. Eso sería!?bash?:s/bash/csh/
o tal vez!?bash?:s/%/csh/
man
páginas, esta característica es increíblemente oscura. Gracias por señalar la sección relevante: ese es el único lugar en los documentos reales donde lo explican lo suficiente.Se puede hacer mucho más con
!
:!-3
!ls
y mucho más. Vea 15 ejemplos de expansión del historial de Linux Bash que debe conocer
fuente
Un amigo mío me envió un correo electrónico esto:
fuente
Por supuesto, puede hacer
!!
para reutilizar el último comando en bash shell. Y luego hay!$
que reutilizar la última parte de su último comando.por ejemplo, ver algún archivo
Si ahora desea editar el mismo archivo, puede usar
!$
para obtener solo la ruta del archivo desde el último comandofuente
$touch f1 f2
y luego$vim !$
evaluará a$vim f2