Bash에서 실패한 명령을 확인하는 방법은 무엇입니까?

Bash에서 실패한 명령을 확인하는 방법은 무엇입니까?

bash 스크립트를 통해 kubernetes가 설치되었는지 확인해야 합니다. 그렇지 않은 경우 설정 프로세스를 시작하겠습니다. kubectl cluster-info출력이 있는지 확인해 보시는 것이 좋을 것 같습니다 . 실패한 명령을 확인하는 방법은 무엇입니까?

if command kubectl cluster-info > /dev/null; then
    # sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
    # ...
fi

답변1

호환되는 쉘 에서 sh존재하지 않는 명령의 종료 상태는 이어야 합니다 127.

명령을 찾을 수 없는 경우 종료 상태는 입니다 127. 명령 이름이 발견되었지만 실행 가능한 유틸리티가 아닌 경우 종료 상태는 이어야 합니다 126.

(원천)

내장된 내용 은 크게 변경되지 않았습니다 command.

[...]는 다음 종료 값을 반환해야 합니다.

126
지정된 유틸리티 [...]를 찾았지만 호출할 수 없습니다.

127
명령 유틸리티에서 오류가 발생했거나 지정된 [...] 유틸리티를 찾을 수 없습니다.

(원천)

귀하의 예가 수정되었습니다 :

command kubectl cluster-info >/dev/null 2>&1
if [ "$?" -eq 127 ]; then …

게다가 type.

유틸리티는 type명령 이름으로 사용되는 경우 각 매개변수가 어떻게 해석되는지 표시해야 합니다.

(원천)

POSIX는 출력의 정확한 형식을 지정하지 않습니다. 종료 상태는 오류와 성공만 구별하면 됩니다. 제공된 명령이 존재하지 않는 것이 성공적으로 발견되었는지 여부는 불분명합니다.

하지만큰 타격을 입은 상태에서의심의 여지가 없습니다:

모든 이름이 발견되면 반환 상태는 0이고, 이름이 발견되지 않으면 0이 아닙니다.

몇 가지 유용한 옵션이 있습니다:

-t이 옵션을 사용 하면 , 또는 (name이 별칭인 경우 쉘 함수, 쉘 내장 함수, 디스크 파일 또는 쉘 예약어 각각) 중 하나 인 type단어를 인쇄합니다 . 이름을 찾을 수 없으면 아무 것도 인쇄되지 않고 실패 상태가 반환됩니다.aliasfunctionbuiltinfilekeywordtype

이 옵션을 사용하는 경우 -ptype은 실행할 디스크 파일의 이름을 반환하거나 -t그렇지 않은 경우 아무것도 반환하지 않습니다 file.

type -t kubectl및/또는의 출력 및 종료 상태를 검사하여 type -p kubectl뭔가를 배울 수 있습니다 .kubectl 아니요불러라.

kubectl그럼에도 불구하고 명령으로 사용될 때 실행될 파일로 해석된다는 것을 미리 발견한다고 해서 그것이 실행된다는 것을 의미하지는 않습니다.이것 kubectl당신은해야합니다.

답변2

기존 답변은 내가 필요한 것과 비슷하지만 기존 답변을 모두 합친 후에는 다음이 작동합니다.

if type kubectl &> /dev/null; then
  source <(kubectl completion bash)
fi

앰퍼샌드가 없으면 출력이 여전히 터미널에 표시됩니다.

관련 정보