foo
스크립트에서 함수를 정의 하고 싶습니다 .원천), 그러나 해당 이름의 일부 실행 파일, 셸 내장, 함수 또는 별칭이 아직 "존재"하지 않는 경우에만 해당됩니다.
이 경우, "존재"의 정의는 그다지 사소하지 않습니다(따라서 겁나는 인용문이 나왔습니다).
첫 번째 근사치로, 나의 조작적 정의는 return 이외의 것이 존재 foo
하면 존재한다는 것입니다 . 이것은 내가 관심 있는 대부분의 경우에 작동합니다.which foo
foo not found
% which cat
/bin/cat
% which cd
cd: shell built-in command
% which zargs
zargs () {
# undefined
builtin autoload -XU
}
% which grep
grep: aliased to grep --color=always
...하지만 다음을 통해 액세스할 수 있는 파일에 정의된 함수는 캡처하지 않습니다 $FPATH
.
% which zargs
zargs not found
물론 내 자신의 래퍼를 굴려 which
아래 함수를 검사 할 수도 있지만 $FPATH
(명시적으로 반복하는 등의 방식으로) 쉘 프로그래밍에 관해서는 보이는 것과 같은 것은 아무것도 없다는 것을 배웠습니다(혹은 과도하게 배웠을 수도 있습니다). 마찬가지로 간단합니다... 따라서 1) 사용 가능한 기능에 대한 존재 테스트를 수행하는 기본 제공 방법이 있거나 적어도 2) 그렇게 하는 확립된 습관이 있는 경우 해당 경로를 선호합니다.
답변1
접근 가능한 함수는 fpath
호출될 수 있기 때문에 "존재"하지 않습니다. 먼저 자동 로드되어야 하며, 그 후에 which
(함수가 존재하는지 테스트하는 다른 방법과 함께) 실제 정의의 스텁 정의가 자동 로드되는 것으로 보고됩니다.
% zargs
zsh: command not found: zargs
% autoload zargs
% which zargs
zargs () {
# undefined
builtin autoload -X
}
which foo
수행할 수 있는 foo
작업 외에도 명령 이름으로 사용할 수 있는지 정확하게 테스트합니다 . 임의의 코드를 포함할 수 있기 command_not_found_handler
때문에 command_not_found_handler
어떤 작업을 수행할 것인지 예측할 수 있는 방법이 없으며, 해당 코드가 발견되면 대체 명령을 실행하기 때문에 어떤 작업도 수행하지 않고는 수행할 작업을 확인할 방법이 없습니다.
코드가 zsh 관련인 경우 whence
대신 사용할 수 있습니다 which
(또는 whence -w
더 깔끔한 출력을 위해 자동으로 만드는 옵션이 없음) whence
. , type
대신 사용해 주세요 which
.
function exists {
whence -w $1 >/dev/null
}
"존재" 정의에 자동 로드할 수 있지만 아직 로드되지 않은 함수가 포함된 경우 자동 로드할 수 있지만 아직 로드되지 않은 함수를 감지하는 코드( $fpath
명시적 순회)를 구현하세요.