다음 스크립트를 실행할 때:
#!/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 top
eg 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
.