Bash 프롬프트에 잘못된 명령을 입력하면 다음 메시지가 나타납니다.
-bash: {command}: command not found
-
처음에는 무슨 뜻인가요?
답변1
이는 로그인 쉘임을 의미합니다.
에서 man bash
:
로그인 쉘에 대한 인수가 없는 첫 번째 문자는 -이거나 --login 옵션으로 시작됩니다.
( bash
용어상 "zero" 매개변수는 명령 이름이며, 귀하의 경우에는 입니다 bash
.) bash
이를 신호로 사용하여 실행 등의 로그인 활동을 수행합니다 .bash_profile
.
대시를 자동으로 추가하는 한 가지 방법은 셸을 시작하는 것입니다 exec
. ~에서배쉬 매뉴얼:
exec [-cl] [-a name] [command [arguments]]
[...]
-l
이 옵션이 제공되면 쉘은 전달된 0번째 인수의 시작 부분에 대시를 배치합니다.주문하다.
예
명령을 실행하려는 두 가지 시도를 비교하십시오 nonexistent
. 먼저 다음이 없습니다 -l
.
$ exec bash
$ nonexistent
bash: nonexistent: command not found
둘째,:
$ exec -l bash
$ nonexistent
-bash: nonexistent: command not found
답변2
다른 답변은 그 자체로는 괜찮지만 이 기능이 bash보다 더 일반적이라는 점은 언급할 가치가 있습니다.
고대부터 login
프로그램은 사용자의 쉘을 실행할 때 대시(-)를 앞에 붙였고 argv[0]
, 쉘은 이를 "로그인 쉘" 역할을 해야 한다는 신호로 인식했습니다. V7 매뉴얼 페이지에 문서화되어 있습니다:로그인(1),쉿 (1).
로그인과 유사한 서비스(사용자 인증 및 셸 실행)를 제공하는 모든 프로그램은 "앞에 오는 대시" 규칙을 따라야 합니다. 예를 들어 sshd는 보시다시피 작동합니다.SSH/session.c이 댓글 아래에:
/*
* If we have no command, execute the shell. In this case, the shell
* name to be passed in argv[0] is preceded by '-' to indicate that
* this is a login shell.
*/
모든 쉘은 선행 대시를 인식합니다. 이에 상응하는 옵션은 기존 Bourne 쉘이나 원래 csh 에는 존재하지 않지만 -l
대부분의 최신 쉘(bash, dash, ksh, yash, tcsh, zsh, rc, es, fish 및 csh의 새로운 버전)에는 이 옵션이 있습니다.
답변3
이 함수의 매개변수는 main
상위 프로세스에 의해 수동으로 설정되며 커널에 의해 미리 설정되지 않습니다. 상위 프로세스는 하위 프로세스에 임의의 값을 설정할 수 있습니다 argv[0]
.man 3 exec
예를 들어 부모는 이렇게 할 수 있습니다.
execlp("bash", "-bash");