¿Qué significa el guión `-` antes de` bash` en el comando 'no encontrado' errores?

28

Cuando ingresa un comando no válido en un indicador de bash, recibe el mensaje

-bash: {command}: command not found

¿Qué significa -al principio?

Evan Purkhiser
fuente
¿Cómo estás ejecutando exactamente el comando? Traté de replicar, pero no obtengo los mismos resultados, por ejemplo,> jhgjbjbkjln: command not foundno -bash: allí. ¿Estás usando bashen Unix, Linux, OSX, ...? Pregunto porque tal vez esto es algo que una implementación específica puso antes del mensaje de error por defecto, y no significa nada ... tal vez.
jimm-cl
@jim Intenta ssh computernamey tu comando no cuenta para replicar.
Bernhard

Respuestas:

27

Significa que es un shell de inicio de sesión.

De man bash:

Un shell de inicio de sesión es aquel cuyo primer carácter del argumento cero es un -, o uno que comenzó con la opción --login.

(En bashterminología, el argumento "zeroth" es el nombre del comando que, en su caso, era bash.) Lo bashutiliza como una señal para realizar actividades de inicio de sesión, como la ejecución .bash_profile, etc.

Una forma en que el guión se puede agregar automáticamente es si se inicia el shell exec. Del manual de Bash :

exec [-cl] [-a name] [command [arguments]]

[...] Si -lse proporciona la opción, el shell coloca un guión al comienzo del argumento zeroth pasado al comando .

Ejemplo

Compare estos dos intentos de ejecutar el comando nonexistent. Primero sin -l:

$ exec bash
$ nonexistent
bash: nonexistent: command not found

Y, segundo, con:

$ exec -l bash
$ nonexistent
-bash: nonexistent: command not found
John1024
fuente
3
Creo que la parte de la documentación que está citando no coincide con su explicación. El hecho de que exec -lanteponga un guión es una forma posible de hacer que bash se ejecute como -bash, pero eso por sí solo no dice que es un shell de inicio de sesión, y hay una muy buena posibilidad de que el OP no se haya utilizado exec -len absoluto . La parte de la documentación que dice -bashque lo convierte en un shell de inicio de sesión es "INVOCACIÓN Un shell de inicio de sesión es aquel cuyo primer carácter del argumento cero es un -, o uno que comenzó con la opción --login".
hvd
@hvd, de acuerdo. Aunque correcta, esta respuesta pierde el punto.
Stéphane Chazelas
1
"El argumento cero" no es bashterminología, sino convención de Unix + indexación en C: cada programa obtiene una lista de parámetros, cuya entrada inicial es el nombre del programa, seguido de los argumentos. Dado que las matrices C se indexan comenzando con cero, el argumento cero (es decir, el argumento cero) es el nombre del programa, y ​​los argumentos reales comienzan con el índice 1.
celtschk
15

La otra respuesta está bien en lo que respecta, pero vale la pena mencionar que la característica es más general que bash.

Desde la antigüedad, el loginprograma ha añadido un guión a argv[0]cuando ejecuta el shell del usuario, y el shell ha reconocido esto como una señal de que debería comportarse como un "shell de inicio de sesión". Está documentado en las páginas de manual de V7 aquí: login (1) , sh (1) .

Todos los programas que proporcionan un servicio similar al de inicio de sesión (autenticar a un usuario y ejecutar un shell) deben seguir la regla de "guión previo". Por ejemplo, sshd hace lo que puede ver en ssh / session.c debajo de este comentario:

/*
 * If we have no command, execute the shell.  In this case, the shell
 * name to be passed in argv[0] is preceded by '-' to indicate that
 * this is a login shell.
 */

Todos los proyectiles reconocen el guión principal. La -lopción equivalente no existe en el shell Bourne clásico o en el csh original, pero la mayoría de los shells más nuevos (bash, dash, ksh, yash, tcsh, zsh, rc, es, fish y cualquier versión semi-reciente de csh) la tienen.

Stéphane Chazelas
fuente
2
Aunque la mayoría de los proyectiles ahora tienen la -lopción, logintodavía no la usan. Se espera que todos los shells reconozcan el prefijo argv[0]como el mecanismo "oficial".
Barmar