问题描述
到目前为止,我曾在bash.bashrc
文件中设置我的环境变量。最近有人告诉我使用/etc/environment
文件。好吧,两者都很好。
那么,它们之间有什么区别?
我搜索了这个,我发现“bashrc用于特定用户和环境,系统范围”。这里的系统是什么意思?我猜/etc/bash.bashrc
也在应用系统变更。如果我错了,请纠正我。任何形式的帮助将不胜感激..
最佳解决方案
一个区别是/etc/environment
仅包含变量定义,并且似乎不经历任何类型的变量扩展/插值。因此,您无法在定义中引用变量。例如这不起作用:
A="else"
B="something $A"
B实际上是something $A
,而不是预期的something else
。
请参阅this question。
顺便说一句,您通过Google找到的答案似乎是指用户的~/.bashrc
,而不是system-wide /etc/bash.bashrc
。这可能会引起你的困惑。
次佳解决方案
/etc/environment
文件为每个启动用户设置变量系统范围。如果任何用户打开了bash
shell,则执行/etc/bash.bashrc
中的命令。因此,除非bash
shell至少打开一次,否则不会设置变量。
第三种解决方案
正如您所问的”system wide”:
位于/etc
目录中的配置文件适用于系统上的所有用户。对于/etc/bash.bashrc
来说,这将意味着在该机器上使用“Borne Again SHell”又名Bash的所有和所有内容。即使您是唯一使用它的人,也可能会受到”technical users”的影响(只需查看/etc/passwd
并查看”/bin/bash”术语在那里的陈述频率 – 或使用grep bash /etc/passwd | wc -l
,它应该直接给您这个数字(意思是: “grab”所有行包含来自文件”/etc/passwd”的字符串”bash”,并将结果(“|”)发送到命令”wc”(字数)以计算行数(“-l”)。
因此,对于您的用户来说,修改~/.bashrc
更安全(意味着文件”.bashrc” – 带有一个前导点,是 – 在您的home-directory中,例如/home/ankur/.bashrc
),这会影响您的用户并将其他所有内容都留下。只有在真正意图改变system-wide时,才应更改/etc
中的文件。
此外:如果存在,将使用这两种配置。首先,读取system-wide文件(此处为:/etc/bash.bashrc
)并将”sourced”(其设置应用于当前会话),然后用户/home/username/.bashrc
处理相同,从而可以添加甚至更改/覆盖全局/etc/bash.bashrc
文件中的设置。
第四种方案
除了系统范围和用户范围的讨论之外,最重要的一个区别是/etc/environment
不是~/.bashrc
以外的脚本。
你不能在/etc/environment
中取消引用变量,它的变量赋值从字面上取字符值(如roadmr已经提到的)。
如果你通过尝试添加新路径搞砸/etc/environment
内的$PATH
,你的Ubuntu会锁定你
PATH=$PATH:/new_path
如果您的Ubuntu Gnome或Unity登录页面未能让您进入而没有抱怨错误的密码。你最近修改了/etc/environment
,很可能就是这种情况。
修复是登录虚拟控制台CTRL
+ ALT
+ F1
登录控制台,手动检查$PATH
,并修复/etc/environment
文件。
根据this,/etc/environment
由PAM堆栈加载,逐行填充环境变量。