嘿,我遇到了这个问题,启动时从 rc.local 启动的脚本没有在启动时设置环境变量(在 /etc/profile.d/* 中定义)。我该怎么办?
“su - lisak -c /opt/atlassian-jira-enterprise-4.1.1-standalone/bin/startup.sh”
“苏-lisak-c /opt/aaa2/at-22/bin/startup.sh”
答案1
的脚本/etc/profile.d/*
是在它们自己的 shell 中执行的,而不是在源代码中执行的,因此它们设置的环境变量无论如何都不可用。您需要什么变量?您可以使用吗/etc/environment
?您可以将变量写入适当脚本格式的文件中var=value
,然后在脚本中获取该文件的源代码rc.local
吗?
这是来自 Bash 手册页。你可能会发现它很有用。
例如,当 bash 以非交互方式启动以运行 shell 脚本时,它会在环境中查找变量 BASH_ENV,如果该变量出现,则扩展其值,并使用扩展的值作为要读取和执行的文件的名称。Bash 的行为就像执行了以下命令一样: if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi 但 PATH 变量的值不用于搜索文件名。
Bourne shell 类似地使用ENV
变量。
答案2
引用自 su 手册页(Slackware 13.1):
-, -l, --login
Provide an environment similar to what the user would expect had
the user logged in directly.
When - is used, it must be specified as the last su option. The
other forms (-l and --login) do not have this restriction.
在您的示例中,您没有指定 - 作为最后一个 su 选项。请尝试这样做或使用替代参数。
答案3
我认为最好的解决方案是 source /etc/profile.d/*.sh 或从 rc.local 运行 /etc/profile 因为我不想重复配置启动时脚本和从登录 shell 启动的脚本...
注意:我不知道从 rc.local 运行 /etc/profile 会产生什么后果...所以最好的方法是从 /etc/profile.d/*.sh 在 rc.local 上获取它们
又名:对于 /etc/profile.d/* 中的文件;执行源 $file;完成
替代方案:echo ". /etc/profile" >> $HOME/.bashrc - 适用于单个用户