web-dev-qa-db-ja.com

子bashスクリプトに別の$ 0を渡すことは可能ですか?

これは「デザイナーの意図したものではない」ように聞こえるかもしれませんが、変更しているbashスクリプトが変更を許可されていない別のbashスクリプトを呼び出す必要があるという現実の状況があります。

その「変更不可能なbashスクリプト」は、次のように始まります。

_source `dirname $0`/setenv.sh
_

(その_setenv.sh_もSCR2PATH=source "$( cd "$(dirname "$0")" ; pwd -P )"で始まり、変更できません)

呼び出し元のスクリプトとは異なる_$0_で子スクリプトをだますことができるトリックはありますか?

12
datsb

多分これはうまくいくでしょう:

bash -c '. /path/to/unmodifiable' /fake/path args ...

明らかに、/path/to/unmodifiableはシェルスクリプトである必要があります。このばかげたトリックは、他の種類の実行可能ファイルでは機能しません。これはzshでも機能しません(dashkshなどの他のシェルでは機能します)。

変更不可能なスクリプトcallの代わりにsourceにする必要がある場合は、外部スクリプトを呼び出すラッパーから同じトリックを使用するか、それ自体を再呼び出しさせることができます。

$ cat unmodifiable
#! /bin/sh
printf '{%s} ' "$0" "$@"
echo

$ cat becoming
#! /bin/sh
[ "$MYSELF" ] || MYSELF=$0 exec sh -c '. "$MYSELF"' "I'm the mountain!" "$@"
. ./unmodifiable

$ chmod 755 becoming
$ ./becoming 1 2 3
{I'm the mountain!} {1} {2} {3}
18
mosvy

子スクリプトを「だます」ことはできませんが、呼び出されたスクリプトへのシンボリックリンクを作成してシンボリックリンクを呼び出すことにより、別の名前で呼び出すことができます。これは、あなたが探している目的を達成すると信じています。

例:

$ cat ./bin/script.sh
echo $0

$ ./bin/script.sh
./bin/script.sh
$ ln -s bin/script.sh foo.sh
$ ./foo.sh
./foo.sh
19
John

サブシェルでexec -aを使用できます:(exec -a fakeDollarZero /unmodifiable/bash/script the rest of the args)

mosvy's answer とは異なり、bashスクリプト以外の場合でもこれは機能します。