
RUNNING_APPS=$(pgrep -f "somePattern")
echo $?
#results in
1
종료 코드 0으로 명령을 통과시키려면 어떻게 해야 합니까?
답변1
내 Arch 시스템에서 pgrep
from 을 사용하면 procps-ng
다음에서 볼 수 있습니다 man pgrep
.
EXIT STATUS
0 One or more processes matched the criteria. For
pkill the process must also have been success‐
fully signalled.
1 No processes matched or none of them could be
signalled.
2 Syntax error in the command line.
3 Fatal error: out of memory etc.
따라서 이것이 바로 그 방식입니다. pgrep
모든 것이 잘 작동했지만 검색 문자열과 일치하는 프로세스가 없으면 1로 종료됩니다. 이는 다른 도구를 사용해야 함을 의미합니다. 아마도 Kusalananda와 같은 것이 의견에서 제안되었으며ilkkachu가 답변으로 게시되었습니다.:
running_apps=$(pgrep -f "somePattern" || exit 0)
그러나 더 나은 접근 방식인 IMO는 스크립트를 변경하는 것입니다. 을 사용하는 대신 set -e
중요한 단계에서 수동으로 종료하도록 하세요. 그런 다음 다음과 같이 사용할 수 있습니다.
running_apps=$(pgrep -fc "somePattern")
if [ "$running_apps" = 0 ]; then
echo "none found"
else
echo "$running_apps running apps"
fi
답변2
를 사용하면 AND( ) 또는 OR( ) 연산자 set -e
왼쪽에 있는 명령으로 인해 셸이 종료되지 않으므로 를 추가하여 오류를 억제할 수 있습니다 .&&
||
|| true
따라서 이는 0
발견된 프로세스에 관계없이 출력되어야 하며 출력하기 전에 종료되어서는 안 됩니다.
set -e
RUNNING_APPS=$(pgrep -f "somePattern" || true)
echo $?