"명령을 찾을 수 없음" 오류에서 "bash" 앞의 대시 "-"는 무엇을 의미합니까?

"명령을 찾을 수 없음" 오류에서 "bash" 앞의 대시 "-"는 무엇을 의미합니까?

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");

관련 정보