bash에서 명령 (: :)으로 두 콜론에 대한 오류 메시지에 세 개의 콜론이 있지만 단일 콜론에 출력이없는 이유는 무엇입니까?


27

내가 입력하면

::

bash 쉘에 다음을 얻습니다.

-bash: ::: command not found

그러나 하나의 :결과 만 출력되지 않습니다. 왜 이런거야?


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
토마스 워드

우분투와 어떤 관련이 있습니까?
NerdOfCode

@NerdOfCode와 같은 방법입니까? meta.askubuntu.com/q/17076/158442
muru

답변:


40

:쉘은 내장에 존재하지 않는 대::

: 쉘 내장 명령 존재 (음 의 차이를 외부 및 내장 명령 ) 아무것도 안하는; true명령 과 마찬가지로 성공 만 반환합니다 . :내장 된 표준 인 POSIX 표준에 의해 정의 가 또한 "널 유틸리티"로 알려져있다. 다음과 같이 무한 루프를 테스트하거나 실행하는 데 자주 사용됩니다.while : ; do ...;done

bash-4.3$ type :
: is a shell builtin

그러나 ::두 개의 콜론 문자는 쉘에 대한 하나의 "단어"로 해석되며 사용자가 입력 한 명령으로 간주됩니다. 쉘은 내장 명령을 검사 한 다음 PATH해당 명령이 존재하는지 변수의 디렉토리를 검사 합니다. 그러나 내장 :: 명령이나 외부 명령 은 없습니다 ::. 따라서 오류가 발생합니다.

글쎄, 오류의 일반적인 형식은 무엇입니까?

<shell>: <command user typed>: error message

따라서 당신이 보는 것은 3 개의 콜론이 아니라 표준 오류 형식으로 붙여 넣은 것입니다.

또한 :명령 행 인수 를 사용할 수 있습니다. 즉, 다음과 같이하는 것이 합법적입니다.

: :

이 경우, 쉘은이를 두 개의 "단어"로 간주합니다. 하나는 명령이고 다른 하나는 위치 매개 변수입니다. 오류도 발생하지 않습니다! ( :위치 매개 변수와 함께 사용하는 것에 대한 이력 노트 (이 답변 뒷부분 참조)도 참조하십시오 .)


bash 이외의 쉘에서

서식은 쉘마다 다를 수 있습니다. 를 들어 bash, kshmksh동작은 일치한다. 예를 들어, 우분투의 기본 /bin/sh쉘 (실제로 /bin/dash) :

$ dash
$ ::
dash: 1: ::: not found

여기서 1은 명령 번호입니다 (스크립트의 줄 번호와 같습니다).

csh 반대로 오류 메시지는 전혀 발생하지 않습니다.

$ csh
% ::
%

실제로를 실행하면 파일 strace -o csh.trace csh -c ::의 추적 출력에 종료 상태 0으로 종료되는 오류가 표시됩니다 (오류 없음). 그러나 이름을 출력하지 않고 오류를 출력합니다.csh.tracecshtcsh

$ tcsh
localhost:~> ::
::: Command not found.

오류 메시지

일반적으로 오류 메시지의 첫 번째 항목은 실행 프로세스 또는 함수 여야합니다 (쉘이 실행을 시도 ::하므로 오류 메시지가 쉘에서 나옵니다). 예를 들어, 여기서 실행 프로세스는 stat다음과 같습니다.

$ stat noexist
stat: cannot stat 'noexist': No such file or directory

실제로 POSIX는 perror () 함수를 정의하는데 , 이는 문서에 따라 문자열 인수를 취한 다음 콜론 다음에 오류 메시지를 출력 한 다음 줄 바꿈을 출력합니다. 인용문:

perror () 함수는 errno 기호를 통해 액세스 한 오류 번호를 언어 별 오류 메시지에 매핑해야하며, 다음과 같이 표준 오류 스트림에 기록됩니다.

  • 먼저 (s가 널 포인터가 아니고 s가 가리키는 문자가 널 바이트가 아닌 경우), s가 가리키는 문자열 뒤에 콜론과 <space>가옵니다.

  • 그런 다음 오류 메시지 문자열 다음에 <newline>이옵니다.

그리고 perror()기술적으로 문자열 인수는 무엇이든 될 수 있지만, 명확성을 위해 그것은 일반적으로 함수 이름 또는 argv[0]입니다.

대조적으로, GNU 오류 취급 함수 및 변수 자체 설정 한 프로그래머가 사용할 수 fprintf()stderr스트림. 링크 된 페이지의 예제 중 하나에서 알 수 있듯이 다음과 같이 할 수 있습니다.

  fprintf (stderr, "%s: Couldn't open file %s; %s\n",
           program_invocation_short_name, name, strerror (errno));

역사적 메모

오래된 유닉스와 톰슨 쉘에서는 문장: 과 함께 사용되었습니다 ( 이 스레드 에서 Perderabo라는 사용자에 따르면 쉘 내장이 아니 었습니다). 매뉴얼에서 인용 :goto

전체 명령 파일에서 첫 번째 공백이 아닌 문자로 시작하고 뒤에 하나 이상의 공백이 있고 레이블이있는 행을 검색합니다. 이러한 행을 찾으면 goto는 명령 파일 오프셋을 레이블 다음 행으로 재배치하고 종료합니다. 이로 인해 쉘이 레이블이 지정된 행으로 전송됩니다.

그래서 당신은 무한 루프 스크립트를 만들기 위해 다음과 같은 것을 할 수 있습니다 :

: repeat
echo "Hello World"
goto repeat

"3 콜론"에 대한 "3 컬럼"오타
Barmar

1
DOS command.com와 Windows cmd.exe는 비슷하지만 반대의 상황이 있습니다. :명시 적으로 goto 레이블 (명령이 아님)이며 종종 주석 문자 (예 :)로 용도가 변경됩니다 :: This is a comment.
grawity

54

마지막 콜론은 기본 "찾을 수 없음"메시지의 일부입니다.

$ x
x: command not found
$ ::
::: command not found

이유 단일 콜론 아무것도 생산하지가 있다는 것입니다 : 이다 유효한 명령 -이 (귀국일을 제외하고 아무것도하지 않는다하더라도 TRUE). 로부터 SHELL BUILTIN COMMANDS의 섹션 man bash:

   : [arguments]
          No effect; the command does nothing beyond  expanding  arguments
          and  performing any specified redirections.  A zero exit code is
          returned.

때로는 같은 구조에서 볼 수 있습니다.

while :
do
  something
done

예를 들어 콜론 내장은 어떤 목적을 수행합니까?


그래이 .. 나보다 가장 포괄적 인 코멘트 .. 훨씬 더 설득력 훨씬 더 설명 : D
존 오리온

8

존재하지 않는 다른 명령을 시도하면 :영어의 일반적인 목적으로 사용됩니다.

$ ---
---: command not found

6

추가 된 콜론은 오류 메시지 자체의 일부입니다. 하나를 입력 cd ow하면 결과가되며 bash: cd: ow: No such file or directory, 이는 오류가 추가 콜론에 있음을 나타냅니다.: No such file or directory


6
$ ::
bash: ::: command not found
$ kkkk
bash: kkkk: command not found

세 번째는 서식의 스페이서입니다.

bash a :에서 빈 줄 무효 명령입니다


4

오류 형식에 콜론이 포함되어 있으므로 3 개의 콜론이 표시됩니다.

bash: <command>: command not found
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.