Bash 通过使用exec执行命令来设置变量

Bash 通过使用exec执行命令来设置变量,bash,syntax,exec,Bash,Syntax,Exec,可以为单个命令设置一个变量,如下所示: MY_VARIABLE=my_value ./my_script.sh exec ./my_script.sh exec MY_VARIABLE=my_value ./my_script.sh 您可以切换到另一个脚本,如下所示: MY_VARIABLE=my_value ./my_script.sh exec ./my_script.sh exec MY_VARIABLE=my_value ./my_script.sh 但当我尝试这样做时: M

可以为单个命令设置一个变量,如下所示:

MY_VARIABLE=my_value ./my_script.sh
exec ./my_script.sh
exec MY_VARIABLE=my_value ./my_script.sh
您可以切换到另一个脚本,如下所示:

MY_VARIABLE=my_value ./my_script.sh
exec ./my_script.sh
exec MY_VARIABLE=my_value ./my_script.sh
但当我尝试这样做时:

MY_VARIABLE=my_value ./my_script.sh
exec ./my_script.sh
exec MY_VARIABLE=my_value ./my_script.sh
我得到一个错误:

exec: MY_VARIABLE=my_value: not found
为什么会这样?

有什么方法可以做到这一点吗?

您需要使用
env
来指定环境变量:

exec env MY_VARIABLE=my_value ./my_script.sh
如果希望脚本从空环境或仅使用指定变量开始,请使用
-i
选项

man env

   env - run a program in a modified environment

在bash中,可以通过将赋值放在命令的开头来设置命令的环境变量。这对
exec
的作用与任何其他命令相同,因此您可以编写:

MYVARIABLE=my_value exec ./my_script.sh

“exec env”的好处在于,您可以在可能设置或不设置shell变量的变量上使用它。例如,如果我有一个脚本,它对任意命令进行了一些设置,我可以用
exec env“$@”
结束它,无论“$@”是否设置变量,它都会工作。要使用此解决方案,我必须解析并拆分“$@”中的参数。如何添加多个环境变量?我知道它很旧,但只是为了回答@maxgalbu问题:
exec env VAR1=value env VAR2=value2./my_script.sh