it-swarm-es.tech

Comprender el signo de exclamación (!) En bash

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

112
Vass

! es una característica que apareció originalmente en C Shell , en los días previos a que pudiera contar con terminales para tener teclas de flecha. Es especialmente útil si agrega el número de comando actual a la solicitud (PS1="\!$ ") para que pueda mirar rápidamente su pantalla para obtener números de comandos anteriores.

Ahora que puedes usar las teclas de flecha y cosas como Ctrl-R para buscar en el historial de comandos, no veo mucho uso para la función.

Una variante de la que aún puedes encontrar útil es !!, que vuelve a ejecutar el comando anterior. Por sí solo, no encuentro !!Enter más rápido que solo Enter, pero puede ser útil cuando se combina en un comando más grande.

Ejemplo: Un común error piloto on Sudo sistemas basados ​​en olvidar el prefijo Sudo 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 de Shell. El iluminado escribe Sudo !!.

Bash te permite desactivar ! procesamiento en el Shell con set +o histexpand o set +H. Puede deshabilitarlo en Zsh con set -K.

157
Warren Young

Si no hay una respuesta más larga aquí, ciertamente hay una en Super Usuario, ya que he leído una recientemente. En bash man page puede encontrar una gran sección titulada EXPANSIÓN DE HISTORIA sobre el asunto.

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 para ejecutar el último comando que comenzó con cat. O !?bash?:s/bash/csh/ ejecuta el último comando que contiene bash pero lo reemplaza con csh.

52
Cry Havok

Se puede hacer mucho más con ! como:

  • ejecutar un comando que se escribe antes de 3 comandos: !-3
  • ejecuta un comando que comienza con !ls

y mucho más. Consulte 15 ejemplos de expansión del historial de Linux Bash que debe conocer

40
user379997

Por supuesto que puedes hacer !! para reutilizar el último comando en bash Shell. Y luego está !$ para reutilizar la última parte de su último comando.

p.ej. ver algún archivo

less path/to/your/file.txt

Si ahora desea editar el mismo archivo, puede usar !$ para obtener solo la ruta del archivo desde el último comando

vim !$

EDITAR:

Puede usar todos los argumentos del comando anterior con !*

por ejemplo: esto creará algunos archivos y los eliminará todos

$ touch a.txt b.txt c.txt d.txt
$ rm !*

Nuevamente, puede usar un argumento específico del comando anterior

p.ej. Esto crea 4 archivos y eliminará el tercer archivo (c.txt)

$ touch a.txt b.txt c.txt d.txt
$ rm !:3

Del mismo modo, puede usar un rango de argumentos del último comando de la siguiente manera

$ touch a.txt b.txt c.txt d.txt
$ rm !:2-4

Esto reutilizará los argumentos 2 a 4 que evalúa la expresión a rm b.txt c.txt d.txt

6
Teshan Shanuka J

Un amigo mío me envió un correo electrónico esto:

Es parte de GNU biblioteca de historial. En bash se usa para volver a ejecutar comandos en su historial. Si quiere ser hardcore, grep para history_expansion_char en bash-4.1/lib/readline/histexpand .c para detalles de implementación.

4
Vass