나는 종료를 호출할 때 이것이 로그아웃의 별칭이라는 것을 알고 있습니다. 가끔 재미로 세션을 종료해야 할 때 다음을 입력합니다 exit && 1
. 이제 exit
실행 후에는 어떤 일이 발생할까요? 어디로 갔나요 1
? Bash에 1을 입력하면 (분명히) 다음이 생성됩니다 1: command not found
. 왜 1이 작동하지 않는지 묻지 않습니다. 내가 묻고 싶은 것은 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는 사용자가 의미하는 바를 이해하지 못하므로 실행을 시작할 수 없습니다.