Bash 不向源脚本提供任何参数

Bash 不向源脚本提供任何参数,bash,Bash,我有一个可以“配置”的bash脚本,因为它源于位于第一个参数处的文件。现在我想将所有其他参数作为参数传递给脚本。当我传递参数时,一切都和我期望的一样。但当我不传递参数时,取而代之的是来自外部脚本的参数 假设我有以下两个脚本: outer.sh #!/bin/bash echo ${@} MYARGS=${@:2} echo $MYARGS . inner.sh $MYARGS inner.sh echo "inner arguments: $@" echo "first: $1" 命令

我有一个可以“配置”的bash脚本,因为它源于位于第一个参数处的文件。现在我想将所有其他参数作为参数传递给脚本。当我传递参数时,一切都和我期望的一样。但当我不传递参数时,取而代之的是来自外部脚本的参数

假设我有以下两个脚本:

outer.sh

#!/bin/bash

echo ${@}
MYARGS=${@:2}
echo $MYARGS 

. inner.sh $MYARGS
inner.sh

echo "inner arguments: $@"
echo "first: $1"
命令行上的结果:

$ ./outer.sh one two #this is what I expected
one two
two
inner arguments: two
first: two

$ ./outer.sh one #this is what puzzles me
one

inner arguments: one
first: one
第一次调用脚本的结果正是我所期望的,因为我提供了参数
two
。但是第二次调用显示了我试图实现的目标:我不需要向脚本传递任何参数


是否有任何解决方案不需要我更改外部脚本中变量的值?

否。当您生成脚本时,脚本中的行将在当前解释器中读取和执行。这意味着它会影响当前的执行环境,并受其影响,包括但不限于变量、函数、选项和陷阱。

保存当前的参数集,以便稍后恢复,然后在查找
internal.sh之前修改该参数集

#!/bin/bash

current_args=( "$@" )
set -- "${@:2}"   # Configure arguments for inner.sh
. inner.sh
set -- "${current_args[@]}"  # Restore arguments for outer.sh

执行第二个脚本而不是源代码?不幸的是,第二个脚本在第一个脚本的后面设置了一些我需要的变量,我不想将它们导出到环境中,因为它们只用于运行第一个脚本。