blog

日常・技術のことを記録する

「シェルスクリプトを起動したときのコマンド文字列そのもの」をシェルスクリプト内で取得する方法

ログ取るときとかで必要になった。
シェルスクリプトを実行したときに、
スクリプト内で「当該シェルスクリプトを起動したときのコマンド文字列そのもの」を取得したいとき。

例えばシェルスクリプトを実行して、

$sh hoge.sh

↑実行後、スクリプト内で"sh hoge.sh"を取得したい。
$0とかだと"hoge.sh"しか取れないからダメ!

できた①
#!/bin/bash
sed -e 's/\x0/ /g' /proc/$$/cmdline

#結果
$sh hoge.sh
sh hoge.sh

/proc/(プロセスID)/cmdlineから取得できるとのこと。
※パラメータはヌル文字区切りなので注意

できた②
#!/bin/bash
ps -p $$ --no-headers -o "%a"

#結果
$sh hoge.sh
sh hoge.sh

$$は「bashの特殊パラメータ」で「シェルスクリプトのプロセスID」を取るもの。
これをpsでPID指定して、さらにargsだけ出力させる、とのこと。φ(・


シェルスクリプトってただのコマンドの羅列だから、自身で実行したコマンドなんてとれないのかなー?historyコマンドをうまいことして抽出するしかないのかなー?)って思ってけど、
ちゃんとできる方法があるんだね・・・すごい!