Entiendo que cuando llamo a salir, es un alias para cerrar sesión. A veces, sólo por diversión, cuando necesito salir de una sesión, escribo exit && 1
. Ahora, ¿qué sucede después de que exit
se haya ejecutado? ¿Adónde va 1
? Escribir 1 en bash produce (obviamente) esto: 1: command not found
. No pregunto por qué 1 no funciona. Estoy preguntando ¿a dónde va el 1 después de llamar a la salida? 1 es sólo un ejemplo, reemplácelo con cualquier otro comando.
Pero al escribir exit &&&&&&& 1
se produce un error de sintaxis. Por eso se debe evaluar la mano derecha.
Descargo de responsabilidad: Esta es una pregunta que me interesa. No hay ninguna razón particular para esta pregunta además del hecho de que tengo curiosidad por saber qué sucede.
Respuesta1
Cuando escribe exit
, el shell se cerrará inmediatamente y 1
no se evalúa. Si revisas el código fuente desalida, puedes ver:
int
exit_builtin (list)
WORD_LIST *list;
{
if (interactive)
{
fprintf (stderr, login_shell ? _("logout\n") : "exit\n");
fflush (stderr);
}
return (exit_or_logout (list));
}
Lo último exit
hace:return (exit_or_logout (list))
static int
exit_or_logout (list)
WORD_LIST *list;
{
int exit_value;
..............
/* Get return value if present. This means that you can type
`logout 5' to a shell, and it returns 5. */
/* If we're running the exit trap (running_trap == 1, since running_trap
gets set to SIG+1), and we don't have a argument given to `exit'
(list == 0), use the exit status we saved before running the trap
commands (trap_saved_exit_value). */
exit_value = (running_trap == 1 && list == 0) ? trap_saved_exit_value : get_exitstat (list);
bash_logout ();
last_command_exit_value = exit_value;
/* Exit the program. */
jump_to_top_level (EXITPROG);
/*NOTREACHED*/
}
El error de sintaxis se exit &&&&&&& 1
debe a un error de análisis, no al resultado de evaluar la expresión. El análisis se produce antes de ejecutar cualquier comando.
Respuesta2
Nunca se ejecuta porque el shell salió. A continuación se muestra una forma sencilla de realizar la prueba:
$ bash
$ touch /tmp/testfile
$ exit && rm /tmp/testfile
exit
$ ls /tmp/testfile
/tmp/testfile
Tenga en cuenta que primero inicié un segundo shell para que mi XTerm no saliera. Se obtiene el mismo resultado cuando no lo hago y compruebo la existencia del archivo desde una ventana diferente.
cmd1 && cmd2
significa ejecutar cmd1
entonces, si es exitoso (código de salida = 0), ejecute cmd2
. Entonces, primero se ejecuta el shell exit
. Salir hace que el shell deje de existir, por lo que nunca llega a la parte "si tiene éxito".
Su seguimiento con el error de sintaxis es diferente: la sintaxis se verifica cuando la línea de entrada esanalizado, antes de que se ejecute cualquier parte del mismo. Básicamente, bash no entiende lo que quieres decir en absoluto, por lo que no puede comenzar a ejecutarlo.