¿Qué sucede en Bash después de llamar a exit?

¿Qué sucede en Bash después de llamar a exit?

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 exitse 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 &&&&&&& 1se 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 1no 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 exithace: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 &&&&&&& 1debe 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 && cmd2significa ejecutar cmd1entonces, 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.

información relacionada