如何将环境变量传递给非交互式 shell(带有示例)?

如何将环境变量传递给非交互式 shell(带有示例)?

在 sh 脚本中,另一个 sh 脚本以 开头su -l <user> -c /path/to/script.sh。据我了解script.sh将在非交互式外壳中运行。官方文档试图解释如何在这样的非交互式 shell 中设置变量,即将它们传递到BASH_ENV[http://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html]。对于初学者来说,这显然是一个不充分的解释,并且没有(真实的)示例(在 $SEARCH_ENGINE 中也没有找到)。

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

可能意味着很多[1]。有人可以举一个传递到非交互式 shell 的环境变量的示例吗?

只是为了确保:登录和非登录以及交互式和非交互式之间的区别对我来说很清楚(https://superuser.com/questions/636219/where-should-i-export-an-environment-variable-so-that-all-combinations-of-bash-d或参考链接(如果有人感兴趣)。


[1]我尝试过

  • BASH_ENV="\\$PATH=$PATH\\n\\$JAVA_HOME=$JAVA_HOME" su -l artifactory -c echo $JAVA_HOME
  • BASH_ENV="\$PATH=$PATH\n\$JAVA_HOME=$JAVA_HOME" su -l artifactory -c echo $JAVA_HOME
  • su -l artifactory -c echo $JAVA_HOME

答案1

如果它是一个sh脚本 - 例如,它显式引用#!/bin/sh- 这可能仍然是bash但就像调用它一样--posix --no-rc --no-profile- 那么您可以ENV使用环境变量指定文件ENV

ENV=/path/to/rcfile sh

特定变量需要在命令行上声明 - 如上面的 for $ENV- 或使用export.例如,对于$PATH你来说:

export "PATH=$PATH:/some/more/paths"; sh

您引用的变量不是您需要获取的文件 - 并且在调用$BASH_ENV时不会将其解释为- 而是调用非交互式shell 时获取的文件的路径 - 例如使用脚本指定:bashshbash

#!/bin/bash

...或者任何爆炸线。

您可能想要调用脚本/shell 的另一种方法是使用env实​​用程序。它可用于显式地从环境中删除值,或者,通常最简单的是,从一开始就将其清除:

env - BASH_ENV=/path/to/rcfile /usr/bin/bash /some/script/file

这将告诉env您调用/usr/bin/bash命令 - 附加所有参数 -$BASH_ENV指定环境变量,但否则完全是干净的环境。

相关内容