我知道这听起来可能“不符合设计者的预期”,但我在现实生活中遇到的情况是,我正在修改的 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,如dash
、ksh
等)。
如果你必须来源代替称呼对于不可修改的脚本,您可以使用调用外部脚本的包装器中的相同技巧,或者让它重新调用自身:
$ 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 脚本,这也会起作用。