是否可以将不同的 $0 传递给子 bash 脚本?

是否可以将不同的 $0 传递给子 bash 脚本?

我知道这听起来可能“不符合设计者的预期”,但我在现实生活中遇到的情况是,我正在修改的 bash 脚本需要调用另一个我不允许修改的 bash 脚本。

“不可修改的 bash 脚本”开头为:

source `dirname $0`/setenv.sh

setenv.sh也以 开头SCR2PATH=source "$( cd "$(dirname "$0")" ; pwd -P )"并且也是不可修改的)

$0有没有一种技巧可以让我用与调用脚本不同的方法来欺骗子脚本?

答案1

也许这会做:

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

显然,/path/to/unmodifiable应该是一个shell脚本;这个愚蠢的技巧不适用于其他类型的可执行文件。这也不适用于zsh(但适用于其他 shell,如dashksh等)。

如果你必须来源代替称呼对于不可修改的脚本,您可以使用调用外部脚本的包装器中的相同技巧,或者让它重新调用自身:

$ 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}

答案2

您不能“欺骗”子脚本,但您可以通过创建指向被调用脚本的符号链接并调用该符号链接,通过不同的名称来调用它。我相信这将实现您正在寻找的目标。

例子:

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

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

答案3

您可以exec -a在子 shell 中使用:(exec -a fakeDollarZero /unmodifiable/bash/script the rest of the args)

不像莫斯维的回答,即使它不是 bash 脚本,这也会起作用。

相关内容