내가 입력하면
::
bash 쉘에 다음을 얻습니다.
-bash: ::: command not found
그러나 하나의 :
결과 만 출력되지 않습니다. 왜 이런거야?
내가 입력하면
::
bash 쉘에 다음을 얻습니다.
-bash: ::: command not found
그러나 하나의 :
결과 만 출력되지 않습니다. 왜 이런거야?
답변:
:
쉘은 내장에 존재하지 않는 대::
:
쉘 내장 명령 존재 (음 의 차이를 외부 및 내장 명령 ) 아무것도 안하는; true
명령 과 마찬가지로 성공 만 반환합니다 . :
내장 된 표준 인 POSIX 표준에 의해 정의 가 또한 "널 유틸리티"로 알려져있다. 다음과 같이 무한 루프를 테스트하거나 실행하는 데 자주 사용됩니다.while : ; do ...;done
bash-4.3$ type :
: is a shell builtin
그러나 ::
두 개의 콜론 문자는 쉘에 대한 하나의 "단어"로 해석되며 사용자가 입력 한 명령으로 간주됩니다. 쉘은 내장 명령을 검사 한 다음 PATH
해당 명령이 존재하는지 변수의 디렉토리를 검사 합니다. 그러나 내장 ::
명령이나 외부 명령 은 없습니다 ::
. 따라서 오류가 발생합니다.
글쎄, 오류의 일반적인 형식은 무엇입니까?
<shell>: <command user typed>: error message
따라서 당신이 보는 것은 3 개의 콜론이 아니라 표준 오류 형식으로 붙여 넣은 것입니다.
또한 :
명령 행 인수 를 사용할 수 있습니다. 즉, 다음과 같이하는 것이 합법적입니다.
: :
이 경우, 쉘은이를 두 개의 "단어"로 간주합니다. 하나는 명령이고 다른 하나는 위치 매개 변수입니다. 오류도 발생하지 않습니다! ( :
위치 매개 변수와 함께 사용하는 것에 대한 이력 노트 (이 답변 뒷부분 참조)도 참조하십시오 .)
서식은 쉘마다 다를 수 있습니다. 를 들어 bash
, ksh
및 mksh
동작은 일치한다. 예를 들어, 우분투의 기본 /bin/sh
쉘 (실제로 /bin/dash
) :
$ dash
$ ::
dash: 1: ::: not found
여기서 1은 명령 번호입니다 (스크립트의 줄 번호와 같습니다).
csh
반대로 오류 메시지는 전혀 발생하지 않습니다.
$ csh
% ::
%
실제로를 실행하면 파일 strace -o csh.trace csh -c ::
의 추적 출력에 종료 상태 0으로 종료되는 오류가 표시됩니다 (오류 없음). 그러나 이름을 출력하지 않고 오류를 출력합니다.csh.trace
csh
tcsh
$ 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
command.com
와 Windows cmd.exe
는 비슷하지만 반대의 상황이 있습니다. :
명시 적으로 goto 레이블 (명령이 아님)이며 종종 주석 문자 (예 :)로 용도가 변경됩니다 :: This is a comment
.
마지막 콜론은 기본 "찾을 수 없음"메시지의 일부입니다.
$ 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
예를 들어 콜론 내장은 어떤 목적을 수행합니까?