Bash usa signos de exclamación para las expansiones del historial, como se explica en las respuestas a esta pregunta (por ejemplo, sudo !!
ejecuta la línea de comandos anterior con sudo
). Sin embargo, no puedo encontrar ningún lugar que explique lo que hace el siguiente comando (es decir, un solo signo de exclamación):
!
Parece que no imprime nada y sale con 1, pero no estoy seguro de por qué lo hace. He buscado en línea y en la página de manual de Bash, pero no puedo encontrar nada, aparte del hecho de que es una "palabra reservada", pero así es }
, y ejecuto esto:
}
imprime un error:
bash: syntax error near unexpected token `}'
!
indica el "inicio" de una expresión de expansión de historial.Respuestas:
El solitario
!
al comienzo de un comando niega el estado de salida del comando o la tubería : si el comando sale0
, se convertirá en1
(falla), y si sale de un estado distinto de cero, lo convertirá en una0
salida (exitosa).Este uso está documentado en el manual de Bash:
Un
!
sin siguiente comando niega el comando vacío, que no hace nada y devuelve true (equivalente a la:
orden ). Por lo tanto, invierte el verdadero en falso y sale con el estado 1, pero no produce ningún error.También hay otros usos de
!
los comandostest
y[[
, donde niegan una prueba condicional. Estos no están relacionados con lo que estás viendo. Tanto en su pregunta como en esos casos no está relacionada con la expansión del historial y!
está separada de cualquier otro término.fuente
Puede encontrar el signo de exclamación único documentado en el manual de bash sección 3.2.2 Tuberías
También la sección 3.2.4.2 Construcciones condicionales
También la sección 4.1 Bourne Shell Builtins
También debe tenerse en cuenta que
!
comenzará la sustitución del historial a menos que vaya seguido de: un espacio, una pestaña, el final de la línea, '=' o '(' (cuando la opción de shell extglob está habilitada usando el shopt incorporado).fuente
Porque
!
se usa en comparaciones y significa NO .Por ejemplo:
fuente
!
un argumento para eltest
comando (incluida la versión incorporada de bash), no el significado de!
cuando se usa en la posición del comando.! [...]
para que coincida con la pregunta en este caso.[]
es asítest
. Estoy un poco apurado.!
comando incorporado, invierte el sentido de una tubería.Otros usos:
#!
comando incorporado, invoca al intérprete nombrado para ejecutar el script.!
designador de evento, marca una palabra de línea de comando como una sustitución del historial!=
operador de desigualdad$!
variable de shell, devuelve el número de proceso del último comando en segundo plano.fuente
ls -l /tmp
cd !$
Esto lo llevará al directorio / tmp.! seguido de una cadena ejecuta el comando anterior más reciente (todavía en el búfer de comandos) que comenzó con la cadena dada. Quizás el shell descubrió que ningún comando anterior comenzó con <null>.
fuente