에서 영감을 받다이 답변: type -p
명령 프롬프트에서 실행하면 명령이 존재하는 경우 경로를 안정적으로 알려줍니다.
pi@raspberrypi:~ $ type -p less
/usr/bin/less
pi@raspberrypi:~ $ type -p asdf
pi@raspberrypi:~ $
그러나 스크립트에서 사용되는 경우 매개변수는 -p
그 자체로 명령인 것처럼 해석됩니다. type
결과에 항상 일부 불량 텍스트가 있기 때문에 명령은 옵션으로 이를 무시하는 것 같습니다 . -p not found
스크립트의 나머지 부분이 중단됩니다.
#!/usr/bin/sh
main() {
for mycommand in $1; do
echo Checking $mycommand
loc="$(type -p "$mycommand")"
echo $loc
if ! [ -f "$loc" ]; then
echo I think I am missing $mycommand
fi
done
}
main "less asdf"
스크립트 출력:
Checking less
-p: not found less is /usr/bin/less
I think I am missing less
Checking asdf
-p: not found asdf: not found
I think I am missing asdf
도와주세요? 이 문제를 일으키는 Raspberry Pi 케이스에 문제가 있는 걸까요?
답변1
-p
type
이 명령에 대한 표준 옵션 이 아닙니다 . type
표준에도 불구하고 유틸리티 자체는 POSIX에서 선택 사항입니다(UNIX 준수 인증을 얻으려면 필요하지만 XSI를 구현하는 시스템에만 필요함) .
type
command -v
대신 명령의 가용성을 확인하는 데 사용할 수 있습니다 . 출력을 확인하지 않고 종료 상태를 통해 명령이 성공적으로 발견되었는지 여부(내장 명령, 함수 내의 외부 명령 내에서 발견 command
되었는지 여부)를 알 수 있습니다 .$PATH
#!/usr/bin/sh -
main() {
for mycommand do
printf >&2 '%s\n' "Checking $mycommand"
if ! command -v -- "$mycommand" > /dev/null 2>&1; then
printf >&2 '%s\n' "I think I am missing $mycommand"
fi
done
}
main less asdf
command
필수 POSIX 유틸리티입니다. 이 -v
옵션은 이전에는 command
선택 사항이었지만 최신 버전의 POSIX 사양에서는 더 이상 그렇지 않습니다.
또한 기억해주세요echo
임의의 데이터를 표시하는 데 사용할 수 없습니다., --
옵션과 비옵션을 구분하는 데 사용해야 하며, 오류(및 진행/조언 정보를 포함한 일반 진단)는 stderr로 이동하는 것이 좋습니다.
그러나 , , 및 shells² type
에서 기본적으로 지원되는 옵션 입니다. 및 에서는 표준(예: 반환된 명령)에서 명령을 검색한다는 의미이고, 에서는 별칭/내장 기능/함수에서만 명령을 검색한다는 의미입니다. 발견된 명령의 경로만 인쇄한다는 점을 제외하면 와 동일합니다. In(예전에는 그랬지만 더 이상 문서화되지는 않았지만 여전히 지원됨)은 성공하지만 명령이 내장된 경우 아무것도 인쇄하지 않고 ksh93과 같은 외부 명령인 경우에만 경로를 인쇄합니다. 에서는 다음과 같이 동작합니다.bash
mksh
ksh93
busybox ash
zsh
yash
mksh
yash
$PATH
getconf PATH
zsh
$PATH
ksh93
bash
-path
type -p
busybox ash
command -v
sh
² 적어도 호출될 때 표준 언어를 어느 정도 준수하는 인터프리터 구현은 sh
표준이 동작을 지정하지 않는 영역(예: 여기)에서 언어 확장을 지원하는 것을 방해하지는 않습니다.
답변2
#!/bin/sh
command="somecommand"
if [ "$(which "$command")" != "" ];
then
echo "command found"
else
echo "command not found"
fi