'command not found'오류에서`bash` 앞의 대시`-`는 무엇을 의미합니까?


28

bash 프롬프트에서 잘못된 명령을 입력하면 메시지가 나타납니다.

-bash: {command}: command not found

-처음에 무엇을 의미합니까?


명령을 정확히 어떻게 실행하고 있습니까? 나는 복제하려고하지만 동일한 결과를 얻기하지 않을거야 - 예> jhgjbjbkjln: command not found- 아니 -bash: 거기. bash유닉스, 리눅스, OSX 등에서 사용 하고 있습니까? 어쩌면 이것이 기본적으로 오류 메시지 앞에 특정 구현이 있기 때문에 묻습니다. 아무 의미도 없습니다 ... 아마도.
jimm-cl

@jim 시도 ssh computername하고 복제하지 않는 명령입니다.
Bernhard

답변:


27

로그인 쉘임을 의미합니다.

보낸 사람 man bash:

로그인 쉘은 인수 0의 첫 문자가-이거나 --login 옵션으로 시작된 문자입니다.

( bash용어에서 "제로"인수는 명령 이름입니다 bash.) bash는이를 실행 등과 같은 로그인 활동을 수행하는 신호로 사용합니다 .bash_profile.

대시가 자동으로 추가되는 한 가지 방법은 쉘이로 시작하는 것 exec입니다. 로부터 배쉬 설명서 :

exec [-cl] [-a name] [command [arguments]]

[...] -l옵션이 제공되면, 쉘은 command에 전달 된 0 번째 인수의 시작 부분에 대시를 배치합니다 .

이 두 가지 시도를 비교하여 명령을 실행하십시오 nonexistent. 우선없이 -l:

$ exec bash
$ nonexistent
bash: nonexistent: command not found

둘째,

$ exec -l bash
$ nonexistent
-bash: nonexistent: command not found

3
인용 한 문서의 일부가 설명과 일치하지 않는다고 생각합니다. 사실 exec -l대시를 앞에 추가 배쉬가로 실행 될 수 있습니다 가능한 방법입니다 -bash,하지만 그 자체로 그게 로그인 쉘이라고 말할하지 않으며, 영업 이익은 사용되지 않았 음을 아주 좋은 기회가 exec -l전혀은 . -bash로그인 쉘을 만드는 문서의 일부 는 "INVOCATION"입니다. 로그인 쉘은 인수 0의 첫 문자가-이거나 --login 옵션으로 시작된 문자입니다.
hvd

@hvd는 동의했다. 맞지만이 대답은 요점을 놓칩니다.
Stéphane Chazelas

1
"제 0의 인수"는 bash용어는 아니지만 Unix 규칙 + C 색인 작성 : 각 프로그램에는 매개 변수 목록이 전달되는데,이 매개 변수 목록에는 초기 항목이 프로그램 이름이며 그 뒤에 인수가옵니다. C 배열은 0부터 시작하여 인덱싱되므로 인수 0 (즉, 0 번째 인수)은 프로그램 이름이며 실제 인수는 인덱스 1로 시작합니다.
celtschk

15

다른 대답은 괜찮아 보이지만 기능이 bash보다 일반적이라는 점은 언급 할 가치가 있습니다.

고대부터 login프로그램은 argv[0]사용자의 쉘을 실행할 때 대시를 추가 했으며, 쉘은이를 "로그인 쉘"로 작동해야한다는 표시로 인식했습니다. login (1) , sh (1) 의 V7 매뉴얼 페이지에 설명되어 있습니다 .

로그인과 유사한 서비스를 제공하는 (사용자 인증 및 셸 실행) 모든 프로그램은 "접두사 앞에 추가"규칙을 따라야합니다. 예를 들어, 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.
 */

모든 쉘은 선행 대시를 인식합니다. 동등한 -lBourne 옵션은 기존 Bourne 쉘 또는 원래 csh에는 없지만 대부분의 최신 쉘 (bash, dash, ksh, yash, tcsh, zsh, rc, es, fish 및 cs의 반 최신 버전)이 있습니다.


2
대부분의 쉘에 -l옵션이 login있지만 여전히 사용하지 않습니다. 모든 쉘은 argv[0]"공식"메커니즘으로 접두사를 인식해야합니다 .
Barmar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.