Was passiert in Bash nach dem Aufruf von exit?

Was passiert in Bash nach dem Aufruf von exit?

Ich verstehe, dass exit ein Alias ​​für Logout ist, wenn ich es aufrufe. Manchmal, nur zum Spaß, wenn ich mich aus einer Sitzung entfernen muss, gebe ich ein exit && 1. Was passiert nun, nachdem exit exitausgeführt wurde? Wohin geht das 1? Wenn Sie 1 in Bash eingeben, erhalten Sie (offensichtlich) Folgendes: 1: command not found. Ich frage nicht, warum 1 nicht funktioniert. Ich frage, wohin die 1 nach dem Aufruf von exit geht? 1 ist nur ein Beispiel, ersetzen Sie es durch jeden anderen Befehl.

Beim Eintippen tritt jedoch exit &&&&&&& 1ein Syntaxfehler auf. Daher muss die rechte Hand ausgewertet werden.

Haftungsausschluss: Das ist eine Frage, die mich interessiert. Es gibt keinen besonderen Grund für diese Frage, außer dass ich neugierig bin, was passiert.

Antwort1

Wenn Sie eingeben exit, wird die Shell sofort beendet, 1wird nicht ausgewertet. Wenn Sie den Quellcode überprüfen,Ausfahrt, du kannst sehen:

int
exit_builtin (list)
     WORD_LIST *list;
{
  if (interactive)
    {
      fprintf (stderr, login_shell ? _("logout\n") : "exit\n");
      fflush (stderr);
    }

  return (exit_or_logout (list));
}

Das Letzte exitist: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*/
}

Der Syntaxfehler ist exit &&&&&&& 1auf einen Analysefehler zurückzuführen und nicht auf das Ergebnis der Auswertung des Ausdrucks. Die Analyse erfolgt vor der Ausführung eines Befehls.

Antwort2

Es wird nie ausgeführt, da die Shell beendet wurde. Hier ist eine einfache Möglichkeit zum Testen:

$ bash
$ touch /tmp/testfile
$ exit && rm /tmp/testfile
exit
$ ls /tmp/testfile 
/tmp/testfile

Beachten Sie, dass ich zuerst eine zweite Shell gestartet habe, damit mein XTerm nicht beendet wird. Dasselbe Ergebnis wird erzielt, wenn ich dies nicht tue und die Dateiexistenz von einem anderen Fenster aus überprüfe.

cmd1 && cmd2bedeutet „Ausführen“ cmd1und dann, wenn es erfolgreich ist (Exit-Code = 0), „Ausführen“ cmd2. Also wird zuerst die Shell ausgeführt exit. Beim Beenden wird die Shell beendet, sodass sie nie zum Teil „Wenn es erfolgreich ist“ gelangt.

Ihre Antwort auf den Syntaxfehler ist anders: Die Syntax wird überprüft, wenn die Eingabezeileanalysiert, bevor irgendein Teil davon ausgeführt wird. Im Grunde versteht Bash überhaupt nicht, was Sie meinen, und kann daher nicht mit der Ausführung beginnen.

verwandte Informationen