명령이 존재하는지 확인하십시오.

명령이 존재하는지 확인하십시오.

에서 영감을 받다이 답변: 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

-ptype이 명령에 대한 표준 옵션 이 아닙니다 . type표준에도 불구하고 유틸리티 자체는 POSIX에서 선택 사항입니다(UNIX 준수 인증을 얻으려면 필요하지만 XSI를 구현하는 시스템에만 필요함) .

typecommand -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과 같은 외부 명령인 경우에만 경로를 인쇄합니다. 에서는 다음과 같이 동작합니다.bashmkshksh93busybox ashzshyashmkshyash$PATHgetconf PATHzsh$PATHksh93bash-pathtype -pbusybox ashcommand -v

sh² 적어도 호출될 때 표준 언어를 어느 정도 준수하는 인터프리터 구현은 sh표준이 동작을 지정하지 않는 영역(예: 여기)에서 언어 확장을 지원하는 것을 방해하지는 않습니다.

답변2

#!/bin/sh
command="somecommand"
if [ "$(which "$command")" != "" ]; 
then
    echo "command found"
else
    echo "command not found"
fi

관련 정보