"bash: 명령: 명령을 찾을 수 없음"이 false를 반환합니까?

"bash: 명령: 명령을 찾을 수 없음"이 false를 반환합니까?

소프트웨어를 자동으로 구성하는 스크립트를 작성 중입니다. 먼저 스크립트가 소프트웨어를 먼저 설치해야 하는지 확인한 다음 구성하고 싶습니다. 확인 $ software --version하고 얻으면 bash: command: command not found먼저 설치하게 될 것입니다.

거짓을 반환하시겠습니까 bash: command: command not found?

편집: 답변이 있으면 답변을 설명해 주실 수 있나요?

답변1

예.

$ spamegg
spamegg: command not found

$ echo $?
127

다음을 수행할 수 있습니다.

if software --version &>/dev/null; then
   ## True, do something
else
   ## False, do something
fi

답변2

특정 명령을 사용할 수 있는지 확인하는 것이 목적이라면 명령을 실행하는 대신 다음을 수행해야 합니다.

if command -v spamegg >/dev/null; then
  echo spamegg is available
else
  apt-get install spamegg
fi

작동하는지 확인하기 위해 실행을 시도하는 것은 spamegg나쁜 접근 방식입니다 . 첫째, 코드를 난독화하여 spamegg무언가를 설치하는 데 사용된 것처럼 보이게 만듭니다 . 두 번째로 (더 중요한 것은) 확인 중인 명령이 존재하지만 어떤 이유로 실패할 수 있습니다.

if grep >/dev/null 2>&1; then
  echo grep is available
else
  echo grep is not available
fi

grep is not available이것도 출력됩니다.

답변3

IMHO, 귀하의 접근 방식이 이 문제를 해결하는 가장 좋은 방법이라고 생각하지 않습니다. 그 이유는 단순히 명령이 반환되기 때문입니다.찾을 수 없음, 프로그램이 그렇지 않다는 의미는 아닙니다.설치됨. 이는 프로그램이 PATH 위치에 없다는 의미일 수도 있습니다.

아마도 더 나은 접근 방식은 실제로 설치된 패키지 목록을 확인하는 것입니다.

RHEL/센트OS:

grep PROGRAM_NAME <(rpm -qa --qf "%{NAME}\n")

데비안/우분투:

grep PROGRAM_NAME <(dpkg --get-selections | awk '{ print $1}')

답변4


# example you need wget and your PATH is okay then:
# bash/ksh/.. will return exit code 127 if command not found
# 
# redirect stdin and stderr to the /dev/null = if exist, 
# output is not interesting
wget --help >/dev/null 2>&1
stat=$?   # variable ? include last command exit status
echo "exit status:$stat"
if ((stat == 127 )) ; then # not exist/found
   echo "install wget"
   exit 1
fi
echo "wget exist, continue"

if before 명령을 사용할 수도 있지만 이 명령은 0이 아닌 모든 종료 코드를 처리합니다.

if를 사용하여 모든 명령을 실행하고 종료 코드를 테스트할 수 있습니다.

# if 명령;
# 잘 작동해요
# 기타
# 별로 좋지 않아
# 飞

# negative testing ! = if not exit code 0 then
if ! wget --help >/dev/null 2>&1 ; then
   # give err msg to the stderr and exit 
   echo "install wget / wget didn't work correctly" >&2
   exit 1
fi
echo "wget works fine"

if로 테스트하기 전에 먼저 작업 종료 코드를 살펴보세요.

wget --help
에코$?
# 0 = OK를 표시합니다. 0이 아니야, 아니야
# 명령 반환이 0이 아닌 경우 테스트에 if를 사용할 수 없습니다.
# 종료 값 = 127로 테스트

관련 정보