質問: シェルスクリプトのプロセスIDについて実験していると#!/bin/bash(sheBang)を書かないとプロセスIDが発行されない事に気付きました。例えば、以下のような例です。 ■noSheBang.sh ``` shellName=${0##*/} shellNameWithOutEx=${shellName%.*} resultOfPgrep=`pgrep ${shellNameWithOutEx}` if test -n "${resultOfPgrep}" then echo "ProcessID of me is ${resultOfPgrep}" else echo "ProcessID was not issued to me " fi ``` ■SheBang.sh(noSheBang.shにsheBangを追加しただけ) ``` #!/bin/bash shellName=${0##*/} shellNameWithOutEx=${shellName%.*} resultOfPgrep=`pgrep ${shellNameWithOutEx}` if test -n "${resultOfPgrep}" then echo "ProcessID of me is ${resultOfPgrep}" else echo "ProcessID was not issued to me " fi ``` ■実行結果 XXXX# ./noSheBang.sh ProcessID was not issued to me XXXX# ./SheBang.sh ProcessID of me is 5257 XXXX# 果たして、sheBangはシェルスクリプト実行時にどのような役割を果たしているのでしょうか?どなたか、シェルスクリプトが実行される仕組みと絡めてご説明いただけないでしょうか? よろしくお願いいたします。
回答: `pgrep`での検索対象のプロセス名とは何かを調べてみました。 PGREPによると > > マッチに用いられるプロセス名は /proc/pid/stat の出力にある 15 文字まで > > に制限されている。完全なコマンドラインである /proc/pid/cmdline にマッチ > > させるには -f オプションを用いること。 > > > ということなので以下をSheBang.shに含めることでプロセス名を確認してみます。 `cat /proc/$$/status | head -c 15` すると、SheBang.shの先頭に`#!/bin/bash`があったとしても たとえば`/bin/bash SheBang.sh`と実行すると「Name: bash」と表示され `ProcessID was not~`となることが確認できると思います。 さらに、もしシェルスクリプト名(も含まれるコマンドライン)でプロセス検索したい場合は `pgrep -f ${shellName}` と実行すればよいことがわかります。