#!/usr/bin/env 使用時にスクリプトが実行されていることを確認してください。

#!/usr/bin/env 使用時にスクリプトが実行されていることを確認してください。

bashスクリプトのshebangをからに移行しようとしていますが、#!/bin/bashこの#!/usr/bin/env bashコードを使用して実行中の既存のインスタンスを確認するため、一部が破損しており、以下でのみ機能します#!/bin/bash

$ pidof -x myscript -o %PPID

私が知りたいのは、呼び出されたスクリプトがenv実行されているかどうかを確認する方法です。私が試したほとんどのソリューションには、汚れた正規表現が含まれており、依然として信頼できないためです。

$ pgrep -f '(^|/)myscript(\s|$)'

私のスクリプトのパスを考えると、/home/user/myscript上記のコードは次のような不要なコマンドのPIDを返すことができます。

editor /home/user/myscript
bash /tmp/myscript
bash /home/user/myscript with spaces

答え1

Linuxでは、pgrep疑わしいPIDを取得し、そのPIDの最初のパラメータを確認できます(参考文献に記載されています/proc/$PID/cmdline)。 ASCII NUL()で区切られた/proc/$PID/cmdlineプロセスのすべてのパラメータ(パラメータ0を含む)を含みます。\0

それは次のとおりです。

pgrep bash | xargs -I {} sed -nz '2{p; q}' /proc/{}/cmdline | grep -Fqzx "$0"

これは、あなたsedgrep線を区切るスペースをサポートすると仮定します。スクリプト名になる対応するsedファイル(パラメータ1)の2行目を印刷します。次に、スクリプト名と正確に一致するものを見つけます。で全体のゲームを完了することができますが、引用符を持っていたずらをしたくない。cmdlinegrepsed

別のパスでスクリプトを呼び出すと失敗します。

/home/user/myscript
cd /home; usr/myscript
myscript

ただし、スクリプト名のスペースは安全でなければなりません。

関連情報