Python 스크립트를 실행하고 결과를 얻으려면 작은 쉘 스크립트를 작성해야 합니다.
이 방법으로 실행하려고 하면 작동합니다.
#!/bin/sh
/usr/bin/python /etc/scripts/backup.py
result=$?
if [ $result -gt 0 ];
then echo 'PROBLEM';
else
echo 'OK';
fi
하지만 이렇게 하려고 하면 실패합니다.
#!/bin/sh
if [ $(/usr/bin/python /etc/scripts/backup.py) -gt 0 ];
then echo 'PROBLEM';
else
echo 'OK';
fi
다음을 반환합니다.
lab-1:/etc/scripts# ./audit_test_wrapper.sh
sh: 0: unknown operand
OK
결과가 잘못되었습니다. "OK" 대신 "PROBLEM"이 인쇄되어야 합니다.
나는 지금까지 무엇을 시도했는가
if [ $(/usr/bin/python /etc/scripts/backup.py) -ne 0 ];
반품
lab-1:/etc/scripts# ./audit_test_wrapper.sh
sh: 0: unknown operand
OK
나는 또한 이것을 시도했습니다 :
if [ "$(/usr/bin/python /etc/scripts/backup.py)" -gt 0 ];
다음을 반환합니다.
lab-1:/etc/scripts# ./audit_test_wrapper.sh
sh: out of range
OK
누구든지 올바른 방향으로 나를 가리킬 수 있습니까?
감사해요.
답변1
$?
이 명령은 표준 출력에 종료 상태( )를 반환 하지 않습니다 . 명령 대체( $(...)
)는 표준 출력을 캡처합니다.
대신 그냥 하세요
#!/bin/sh
if ! /usr/bin/python /etc/scripts/backup.py; then
echo 'PROBLEM'
else
echo 'OK'
fi
PROBLEM
Python 스크립트가 0이 아닌 종료 상태로 종료되면 첫 번째 분기가 선택되어 인쇄됩니다.
if
이 말은 "스크립트가 성공하지 못한 경우"로 이해할 수 있습니다 .
제거하고 싶다면 !
:
#!/bin/sh
if /usr/bin/python /etc/scripts/backup.py; then
echo 'OK'
else
echo 'PROBLEM'
fi
if
이 명령문은 "스크립트가 성공할 경우"로 해석 할 수 있습니다 .
이것실수당신이 얻는 결과는 스크립트가 아무것도 출력하지 않는다는 사실에서 비롯됩니다. 이는 명령 대체가 비어 있음을 의미합니다. 인용되지 않았기 때문에 쉘이 실행하려고 하는 명령은 다음과 같습니다.
if [ -gt 0 ]
구문 오류입니다.
명령 대체를 인용하면 기본적으로 다음을 실행하려고 합니다.
if [ "" -gt 0 ]
그리고 쉘은 빈 문자열을 정수로 비교할 수 없습니다.
답변2
Kusalananda가 보여준 것처럼, 당신은 단지 다음을 사용해야 합니다.
if cmd; then
echo "command succeeded"
else
echo "command failed: $?"
fi
보다 예시적인 예에서는 이와 같은 명령을 실행하여 0이 아닌 종료 코드가 "false"인 이유와 'if', 'while' 및 기타 논리적 비교에 대한 0 종료 코드가 셸 명령 구조인 이유를 확인할 수 있습니다. 사실인가요?
$ if (exit 3); then echo succeeded ; else echo failed $?;fi
failed 3
$ if (exit 0); then echo succeeded ; else echo failed $?;fi
succeeded
$
while 루프는 다음과 같이 작동합니다.
$ i=3;while ! (exit $i); do echo failed $i; ((i--));done
failed 3
failed 2
failed 1
$
연결에 실패한 명령을 다시 시도하거나 성공할 때까지 다시 시도해야 하는 데 사용할 수 있습니다.
(exit ...)을 사용하여 명령을 별도의 프로세스로 실행합니다. 내장 셸 명령의 경우 이는 스크립트를 실행하는 셸 인스턴스가 종료되는 것을 방지하는 데 필요합니다. 대신, 쉘은 종료 코드가 $? 값을 제공하는 하위 프로세스를 생성합니다. 쉘 매뉴얼 페이지에 표시된 대로.