私がこれを持っているとしましょう:
#!/bin/sh
function show_help {
cat<<%
Usage: $0 [-h]
%
}
# the following lines is pseudo-code
if argument contains "-h"
show_help
otherwise
do_stuff
実行すると、./test
期待どおりにいくつかのタスクが実行されますが、実行すると./test -h
生成されます。
Usage: show_help [-h]
しかし、私はそれを実現します。
Usage: ./test [-h]
それでは、関数を修正してshow_help
これをどのように達成できますか?スクリプト自体を変更したくないので、SCRIPT_NAME=$0
shebang行の下にしか追加しません。ソリューションがaやfunctionなどの一種の組み込み
変数であることを願っています。実際に存在しますか?$PWD
pwd
答え1
私はこれを再現できません。この質問には「/bash」タグが付けられています。
Bashの場合、$ 0は常にスクリプト名なので、/tmp/testにある場合
#!/bin/bash
function show_help {
cat <<%
Usage: $0 [-h]
%
}
show_help
それではbash /tmp/test
私にくださいUsage: /tmp/test [-h]
。
getを使用すると、POSIX以外の方法で関数を宣言するときにkshが$ 0を設定するため、ksh93 /tmp/test
getを使用します。Usage: show_help [-h]
移植可能な関数宣言に切り替える
#!/bin/bash
show_help() {
cat <<%
Usage: $0 [-h]
%
}
show_help
Usage: /tmp/test [-h]
kshとbashから入手できます。
だから元のスクリプトには多くのエラーがありました。#!/bin/sh
bashに関する質問であれば、関数宣言が正しくなく、#!/bin/bash
最後の構文が間違っています。if
答え2
BASHは$ FUNCNAME [1]を使用します。 $FUNCNAME[0] は show_help です。 show_helpを呼び出した親関数の行番号とソースファイル名($BASH_LINENO[1]、$BASH_SOURCE[1])を取得することもできます。
korn shell(ksh)にも同様の回答を探しています.
答え3
なぜなら、この質問は宿題の質問のように見えます。だから、正確な答えではなく、いくつかのヒントを提供します。
- 実行中のプロセスの親PIDを取得する
grep PPid /proc/self/status | awk '{print $2}
- 実行可能ファイル名を確認する
ls /proc/<PPid>/exe
- readlinkを使用して上記のソフトリンク名を印刷します。
readlink /proc/<PPid>/exe
出力サム実行するスクリプトの名前です。