pgrep -f는 1로 종료됩니다.

pgrep -f는 1로 종료됩니다.
RUNNING_APPS=$(pgrep -f "somePattern")
echo $?

#results in
1

종료 코드 0으로 명령을 통과시키려면 어떻게 해야 합니까?

답변1

내 Arch 시스템에서 pgrepfrom 을 사용하면 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 $?

관련 정보