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)

하지만 제 생각에는 더 좋은 방법은 스크립트를 변경하는 것입니다. 사용하지 말고 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 $?

관련 정보