예를 들어 터미널을 연결한 unix.stackexchange.com
후 Enter다시 연결하면 다음 오류가 발생합니다.
unix.stackexchange.com: command not found
예상했던 대로 괜찮습니다. 하지만 을 삽입하면 http://unix.stackexchange.com
또 다른 오류 메시지가 나타납니다.
bash: http://unix.stackexchange.com: No such file or directory
왜 오류가 발생하는지 묻지 않겠습니다. 왜 다른지, 그리고 최종적으로 어떤 프로세스/기능이 이를 처리하는지 알고 싶습니다.
답변1
또한 좋아요유박이 지적했다., 후자의 명령줄에 슬래시( /
)가 포함되어 있어 쉘이 이를 파일 경로로 해석하기 때문에 오류 메시지가 다릅니다.
이 경우 두 오류 모두 쉘에서 발생합니다 bash
(두 번째 오류 메시지에서 알 수 있듯이).
보다 구체적으로 말하면, 첫 번째 오류는 다음에 execute_disk_command()
정의된 함수 에서 비롯됩니다.execute_command.c
bash-4.2
소스 코드. 에 정의된 함수 호출은 execute_disk_command()
슬래시가 포함되어 있지 않은 경우 검색됩니다. 슬래시가 포함되어 있으면 이 검색이 수행되지 않습니다. 명령이 반환되지 않으면 내부 오류로 인해 실패합니다.search_for_command()
findcmd.c
pathname
$PATH
pathname
pathname
search_for_command()
search_for_command()
execute_disk_command()
command not found
두 번째 오류는 shell_execve()
역시 에 정의된 함수 에서 발생합니다 execute_command.c
. 이 시점에서 시나리오에서는 조회가 필요하지 않고 호출되어 시스템 호출을 수행하므로 search_for_command()
성공이 반환됩니다 . 실행하려는 파일이 존재하지 않고 이를 나타내는 적절한 설정이 있기 때문에 실패합니다 . 실패 시 해당 파일 오류 메시지( )를 보고하고 오류 발생 시 즉시 셸을 종료하는 데 사용됩니다 .execute_disk_command()
shell_execve()
execve()
execve()
execve()
errno
execve()
shell_execve()
strerror()
No such file or directory
답변2
이 /
문자는 경로 이름 구분 기호입니다. 따라서 쉘은 사용자가 unix.stackexchange.com
디렉토리라는 이름의 명령에 대한 상대 경로를 지정한다고 가정합니다 http:
. 쉘이 디렉토리나 파일을 찾을 수 없으며 다음과 같이 말합니다. 예를 들어 이름이 지정된 명령을 실행하려고 하면 동일한 오류 메시지가 표시됩니다 foo/bar/grill/snorklewacker
.
반면, 경로 이름 구분 기호 없이 단순 명령 이름을 입력하면 쉘은 PATH
환경 변수의 디렉토리 목록을 나타나는 순서대로 확인하여 프로그램이 포함되어 있는지 확인합니다. 따라서 내 시스템에 프롬프트된 대로 입력하면 unix.stackexchange.com
쉘은 다음을 검색합니다.
- /usr/local/bin/unix.stackexchange.com
- /usr/bin/unix.stackexchange.com
- /bin/unix.stackexchange.com
- /usr/local/games/unix.stackexchange.com
- /usr/games/unix.stackexchange.com
이러한 검색이 모두 실패하면 오류가 발생합니다 command not found
.