如何确保在bash会话中为用户设置环境variables?

如何确保为用户设置了一个环境variables? 我有

MYVAR=whatever export MYVAR 

在〜/ .bash_profile中,但来自用户的报告表明它没有为他们工作。 发生什么事了?

使用名为pam_env的PAM模块在login时设置环境variables。 如果你使用这个解决scheme,环境variables也可以直接从“Window Manager”(例如GNOME,KDE)启动的GUI程序中使用,不仅仅是从terminal启动的程序。 另外,用户可以使用另一个shell,而不仅仅是Bash。 也许O'Reilly的这篇文章可以帮助你。

一些摘录从bash manpage:

当bash作为交互式loginshell或者作为具有–login选项的非交互式shell调用时,它首先从文件/etc/profile读取和执行命令(如果该文件存在)。 读取该文件后,它将按照该顺序查找~/.bash_profile~/.bash_login~/.profile ,并从第一个存在并读取的第一个中读取和执行命令。 当shell开始禁止这种行为时,可以使用--noprofile选项。

当一个不是loginshell的交互式shell被启动时,如果这些文件存在,bash将从/etc/bash.bashrc~/.bashrc读取和执行命令。 这可以通过使用--norc选项来禁止。 --rcfile文件选项将强制bash从文件读取和执行命令,而不是/etc/bash.bashrc~/.bashrc

这可以解释为什么它“没有为他们工作”?

从你的代码中,你可以这样做:

 if [ x"$MYVAR" = "x" ] then echo "it didn't work" exit 1 fi echo "it did work: $MYVAR" 

如果你是从用户自己的.bash_login或.bashrc之类的东西来设置的,他们是否正在摆脱他们的环境?

只有当该variables的后续使用依赖于导出时,才能导出variables。 也就是说,在他们的login过程中出口应该为他们运行的任何东西工作,除非他们su / sudo,在这种情况下,他们实际上正在离开那个环境,然后执行他们正在做的任何事情。

它应该在~/.bashrc设置,如果它不是loginshell,例如他们在Gnome中运行一个terminal。

此外,您将文件列为./bash_profile但不会显示文件的位置(它表示它位于当前目录中)。 我假设你的意思是/etc/bash_profile 。 该文件仅用于loginshell或非交互式文件。

jjujuma

首先确保用户正在使用bash。 他/她可能正在使用csh。 如果你想让它只为那个用户设置,他们使用的是bash / sh,那么你需要把它放在.bashrc文件中。 如果csh / tcsh你需要把它放在.cshrc / .tcshrc中。 如果你想为所有的用户/ etc / profile全局设置,并且为bash / tcsh设置/etc/csh.cshrc,那么你将会启动并运行!

HTH