在 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 时获取的文件的路径 - 例如使用脚本指定:bash
sh
bash
#!/bin/bash
...或者任何爆炸线。
您可能想要调用脚本/shell 的另一种方法是使用env
实用程序。它可用于显式地从环境中删除值,或者,通常最简单的是,从一开始就将其清除:
env - BASH_ENV=/path/to/rcfile /usr/bin/bash /some/script/file
这将告诉env
您调用/usr/bin/bash
命令 - 附加所有参数 -$BASH_ENV
指定环境变量,但否则完全是干净的环境。