$(pgrep -f) 스크립트 내의 동작은 shebang에 따라 변경됩니다.

$(pgrep -f) 스크립트 내의 동작은 shebang에 따라 변경됩니다.

다음 스크립트를 실행할 때:

#!/bin/bash
$(pgrep -u ubuntu -f ${1} > /dev/null)
echo "CURRENT_STATUS="${?}

그리고:

./my_script.sh top

top실행되지 않으면 다음을 반환합니다 .

CURRENT_STATUS=0

1종료 상태를 예상했기 때문에 이것은 이상합니다 pgrep. 스크립트에서 shebang을 제거하면 예상대로 작동합니다.

여기서 무슨 일이 일어나고 있는지 이해하도록 도와줄 수 있는 사람이 있나요?

이것은 Ubuntu 22.4.1 시스템에 있습니다. 또한 이로 인해 $(...)결과가 변경되지는 않습니다.

나는 이것이 pgrep그 자체로 일치하는 것 같다는 것을 알았습니다. 그래서 어떤 프로세스 이름을 입력하더라도 결과가 0이 됩니다.

답변1

hashbang을 사용하여 커널은 명명된 인터프리터를 실행하여 스크립트 파일 이름과 사용자가 제공한 인수(명령줄은 )를 전달하고 /bin/bash ./my_script.sh topeg in the process list 로 표시되며 ps유사하게 pgrep찾습니다 . top결국 키워드와 일치합니다.

hashbang이 없으면 커널 수준 시스템 호출이 실패하고 Bash는 내부적으로 스크립트 자체를 실행하며 매개 변수는 프로세스 목록에 표시되지 않습니다. (셸은 이 작업을 어떻게든 수행합니다. IIRC는 실행 불가능한 파일이 가능하면 셸을 통해 실행되어야 한다는 POSIX 요구 사항입니다.)

다음 두 가지 테스트를 사용하는 것이 더 쉽습니다.

bash$ cat wait.sh
#!/bin/bash
sleep 50

bash$ cat wait2.sh
sleep 50

bash$ ./wait.sh & ./wait2.sh & ps uax |grep wait
ilkkachu  9029  0.0  0.0  15368  3060 pts/21   S    20:01   0:00 /bin/bash ./wait.sh
ilkkachu  9032  0.0  0.0  16964   968 pts/21   S+   20:01   0:00 grep wait

해시뱅이 없는 사람은 나타나지 않습니다.

pgrep나는 그 자체를 찾을 수 없을 만큼 똑똑하고 대신 스크립트를 찾는 데 도움을 줄 수 있다고 생각합니다 . 이와 같은 패턴을 사용할 수 있고 '[t]op'일치 top하지만 자체는 일치하지 않습니다. 그러면 ./my_script.sh '[t]op'차이가 사라집니다.

하지만 거기에 있는 명령 대체는 쓸모가 없으니 그냥 버리세요 pgrep.

관련 정보