bash 스크립트의 변수에 pgrep 출력을 올바르게 할당할 수 없는 이유는 무엇입니까?

bash 스크립트의 변수에 pgrep 출력을 올바르게 할당할 수 없는 이유는 무엇입니까?

실행 중인 동안 compton을 종료하거나, 실행 중이 아니면 시작하는 스크립트를 만들려고 합니다. 나는 프로세스가 발견되면 1을 종료해야 한다는 내용을 읽었으므로 이를 사용하는 스크립트를 만들려고 시도했지만... 작동하지 않고 닫히면 시작되지만 닫히지 않습니다. 내가 뭘 잘못했나요? ?

#!/bin/bash


status=$(pgrep compton 2>&1)

if [[ $status == 1 ]];
    then
        killall compton
    else
        exec compton -b
fi

echo $status

답변1

pgrep변수 로 출력을 가져옵니다 status. 이는 예상한 결과가 아닙니다.

pgrep지정한 패턴과 일치하는 프로세스의 프로세스 ID(PID)를 인쇄합니다. 이름이 일치하는 프로세스가 있는 경우 해당 프로세스의 PID가 됩니다 compton. 종료 상태도 반환되지만 명령 대체는 종료 상태를 문자열로 캡처하지 않습니다.$statuspgrep

테스트에서는 $status와 비교할 것입니다 1. PID가 compton1일 가능성은 거의 없습니다.


compton기존 프로세스를 종료 하고 compton -b프로세스가 없으면 시작하려면 compton다음을 사용할 수 있습니다.

#!/bin/sh

if ! pkill compton; then
    exec compton -b
fi

이는 종료 상태를 사용합니다 pkill. 이 도구는 (보통 쌍으로 배포 및 설치됨) 동일하게 pkill작동 하지만 이전과 같이 일치하는 프로세스의 PID를 출력하는 대신 기본적으로 일치하는 프로세스에 신호를 보냅니다 .pgreppgreppkillTERM

if키워드는 함께 사용되는 명령의 종료 상태를 사용합니다.

!테스트의 의미를 뒤집어서

  • 성공 하면 pkill compton다음이 있음을 의미합니다.예전에는이제 하나 이상의 compton프로세스가 종료되었거나 최소한 신호를 받았으므로 exec compton -b실행되지 않습니다.

  • 실패할 경우 pkill compton(이름과 일치하는 프로세스가 없거나 에 내부 오류가 있는 경우 pkill) 명령문 본문은 ifyours 를 호출하여 exec compton -b셸 프로세스를 를 실행하여 생성된 프로세스로 대체합니다 compton -b.

답변2

$?에서 변수가 될 pgrep 프로세스의 종료 상태를 제어해야 합니다. 또는 pgrep 출력을 저장하는 $status 변수가 길이가 0이 아닌 문자열인지 확인하세요. 질문의 스크립트는 변수 상태의 문자열이 "1"인지 확인합니다.

그래서

#!/bin/bash
pgrep compton >/dev/null

if [[ $? -eq 0 ]]
then
    killall compton
else
    exec compton -b
fi

또는

#!/bin/bash
status=$(pgrep compton 2>&1)

if [[ -n "$status" ]]
then
    killall compton
else
    exec compton -b
fi

관련 정보