나는 종료를 호출할 때 이것이 로그아웃의 별칭이라는 것을 알고 있습니다. 때로는 재미로 세션에서 자신을 제거해야 할 때 를 입력합니다 exit && 1
. 이제 exit
실행된 후에는 어떤 일이 발생합니까? 어디로 가나요 1
? bash에 1을 입력하면 (분명히) 다음과 같은 결과가 나옵니다 1: command not found
. 왜 1이 작동하지 않는지 묻지 않습니다. Exit를 호출한 후 1은 어디로 가는지 묻고 있습니다. 1은 예시일 뿐이므로 다른 명령으로 바꾸세요.
그러나 입력하면 exit &&&&&&& 1
구문 오류가 발생합니다. 그래서 오른손을 평가해야합니다.
부인 성명: 이것은 제가 관심을 갖고 있는 질문입니다. 무슨 일이 일어나는지 궁금하다는 점 외에는 이 질문을 하게 된 특별한 이유는 없습니다.
답변1
를 입력하면 exit
쉘이 즉시 종료되고 1
평가되지 않습니다. 소스코드를 확인해보면출구, 너는 볼 수있어:
int
exit_builtin (list)
WORD_LIST *list;
{
if (interactive)
{
fprintf (stderr, login_shell ? _("logout\n") : "exit\n");
fflush (stderr);
}
return (exit_or_logout (list));
}
마지막 작업은 다음 exit
과 같습니다.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*/
}
exit &&&&&&& 1
표현식 평가 결과가 아닌 구문 분석 오류로 인한 구문 오류입니다 . 구문 분석은 명령이 실행되기 전에 발생합니다.
답변2
쉘이 종료되었기 때문에 결코 실행되지 않습니다. 테스트하는 쉬운 방법은 다음과 같습니다.
$ bash
$ touch /tmp/testfile
$ exit && rm /tmp/testfile
exit
$ ls /tmp/testfile
/tmp/testfile
내 XTerm이 종료되지 않도록 먼저 두 번째 셸을 시작했습니다. 그렇게 하지 않고 다른 창에서 파일 존재 여부를 확인해도 동일한 결과가 나타납니다.
cmd1 && cmd2
실행을 의미하며 cmd1
, 성공하면(종료 코드 = 0) 실행합니다 cmd2
. 따라서 먼저 쉘이 실행됩니다 exit
. 종료하면 쉘이 더 이상 존재하지 않으므로 "성공한 경우" 부분에 도달하지 않습니다.
구문 오류에 대한 후속 조치가 다릅니다. 입력 줄이 다음과 같을 때 구문을 확인합니다.파싱된, 일부가 실행되기 전에. 기본적으로 bash는 사용자가 의미하는 바를 전혀 이해하지 못하므로 실행을 시작할 수 없습니다.