datsb Asked: 2019-12-26 05:42:27 +0800 CST2019-12-26 05:42:27 +0800 CST 2019-12-26 05:42:27 +0800 CST 是否可以将不同的 $0 传递给子 bash 脚本? 772 我知道这可能听起来“不像设计师的意图”,但我有现实生活中的情况,我正在修改的 bash 脚本需要调用另一个我不允许修改的 bash 脚本。 “不可修改的 bash 脚本”以: source `dirname $0`/setenv.sh (setenv.sh也以开头SCR2PATH=source "$( cd "$(dirname "$0")" ; pwd -P )"并且也是不可修改的) 有没有一个技巧可以用与$0调用脚本不同的方法来欺骗子脚本? bash arguments 3 个回答 Voted John 2019-12-26T05:47:22+08:002019-12-26T05:47:22+08:00 您不能“欺骗”子脚本,但您可以通过创建指向被调用脚本的符号链接并调用符号链接来通过不同的名称调用它。我相信这将实现您正在寻找的目标。 例子: $ cat ./bin/script.sh echo $0 $ ./bin/script.sh ./bin/script.sh $ ln -s bin/script.sh foo.sh $ ./foo.sh ./foo.sh Best Answer mosvy 2019-12-26T20:26:20+08:002019-12-26T20:26:20+08:00 也许这会做: bash -c '. /path/to/unmodifiable' /fake/path args ... 显然,/path/to/unmodifiable应该是一个shell脚本;这个愚蠢的技巧不适用于其他类型的可执行文件。这也不适用于zsh(但适用于其他 shell,如dash,ksh等)。 如果您必须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} Joseph Sible-Reinstate Monica 2019-12-28T13:27:15+08:002019-12-28T13:27:15+08:00 您可以exec -a在子shell中使用:(exec -a fakeDollarZero /unmodifiable/bash/script the rest of the args) 与mosvy 的 answer不同,即使它不是 bash 脚本,它也会起作用。
您不能“欺骗”子脚本,但您可以通过创建指向被调用脚本的符号链接并调用符号链接来通过不同的名称调用它。我相信这将实现您正在寻找的目标。
例子:
也许这会做:
显然,
/path/to/unmodifiable
应该是一个shell脚本;这个愚蠢的技巧不适用于其他类型的可执行文件。这也不适用于zsh
(但适用于其他 shell,如dash
,ksh
等)。如果您必须source而不是调用不可修改的脚本,您可以使用调用外部脚本的包装器中的相同技巧,或者让它重新调用自己:
您可以
exec -a
在子shell中使用:(exec -a fakeDollarZero /unmodifiable/bash/script the rest of the args)
与mosvy 的 answer不同,即使它不是 bash 脚本,它也会起作用。