소프트웨어를 자동으로 구성하는 스크립트를 작성 중입니다. 먼저 스크립트가 소프트웨어를 먼저 설치해야 하는지 확인한 다음 구성하고 싶습니다. 확인 $ 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로 테스트