我希望执行一个脚本,但在执行之前让它包含另一个脚本。问题是,将生成包含的脚本,并且执行的脚本将是不可修改的。我提出的一个解决方案是实际反转include,将include脚本作为包装器,调用set
来设置执行脚本的参数,然后点击/获取它。 E.g。
#!/bin/bash
# Generated wrapper or include script.
: Performing some setup...
target_script=$1 ; shift
set -- "$@"
. "$target_script"
target_script
是我实际想要运行的脚本,从包装器导入设置。
但是,我面临的潜在问题是目标脚本的调用者甚至目标脚本本身可能希望将$0
设置为它在文件系统上的位置路径。但由于此包装器方法会覆盖$0
,因此$0
的值可能是意外的,并且可能会产生未定义的行为。
是否有另一种方法可以执行有效的方法,LD_PRELOAD
但是采用脚本形式,通过bash而不会干扰其运行时参数?
我查看了--init-file
或--rcfile
,但这些似乎只包含在交互式shell中。
答案 0 :(得分:1)
强制交互模式似乎允许我指定--rcfile
:
$ bash --rcfile /tmp/x-include.sh -i /tmp/xx.sh
include_script: $0=bash, $BASH_SOURCE=/tmp/x-include.sh
target_script: $0=/tmp/xx.sh, $BASH_SOURCE=/tmp/xx.sh
x-include.sh
脚本的内容:
#!/bin/bash
echo "include_script: \$0=$0, \$BASH_SOURCE=$BASH_SOURCE"
xx.sh
脚本的内容:
#!/bin/bash
echo "target_script: \$0=$0, \$BASH_SOURCE=$BASH_SOURCE"
答案 1 :(得分:0)
来自bash文档:
When bash is started non-interactively, to run a shell script, for example, it looks for the variable BASH_ENV in
the environment, expands its value if it appears there, and uses the expanded value as the name of a file to read
and execute. Bash behaves as if the following command were executed:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
but the value of the PATH variable is not used to search for the file name.
然后解决它:
BASH_ENV=/tmp/x-include.sh /bin/bash /tmp/xx.sh