我正在使用 Linux Mint。我的登录 shell ( cat /etc/passwd | grep myUserName
) 是 bash。
在启动图形桌面环境并从中运行终端模拟器后,我可以看到它.bash_profile
没有来源(其中编辑的环境变量export
未设置)。但是,如果我从文本控制台( ctrl++ )登录或从终端模拟器手动运行,alt则工作正常。F1bash -l
.bash_profile
.bash_profile
当我认为应该在 X 启动时获取并且所有export
'ed 变量应该在终端中可用并从 X 运行时,我是否错了?
PS 将所有东西放入.bashrc
并从中采购.bash_profile
这不是个好主意:环境的东西应该只采购一次。
答案1
当 bash 是登录 shell 时,该文件~/.bash_profile
由 bash 读取。这就是您以文本模式登录时得到的结果。
当您在 X 下登录时,启动脚本由/bin/sh
.在 Ubuntu 和 Mint 上,/bin/sh
是短跑,而不是重击。 Dash 和 bash 都具有相同的核心功能,但 dash 坚持这些核心功能是为了快速且小,而 bash 以需要更多资源为代价添加了很多功能。通常将 dash 用于不需要额外功能的脚本,并使用 bash 进行交互式使用(尽管桀骜 有很多更好的功能)。
显示管理器(您在其中键入用户名和密码的程序)和桌面环境的大多数组合均从、或适用者~/.profile
中的登录脚本读取。因此,将您的环境变量定义放入.确保仅使用 dash 支持的语法。/etc/X11/Xsession
/usr/bin/lightdm-session
/etc/gdm/Xsession
~/.profile
那么你应该把什么放在哪里呢?
一个好的
.bash_profile
加载,并且如果 shell 是交互式的则.profile
加载。.bashrc
. ~/.profile if [[ $- == *i* ]]; then . ~/.bashrc; fi
在 中
.profile
,放置环境变量定义和其他会话设置,例如ulimit
.- 在 中
.bashrc
,放置 bash 交互设置,例如别名、函数、完成、键绑定(不在 中.inputrc
),...
答案2
.bash_profile
是bash的启动配置脚本。不存在强制 X 来源的标准.bash_profile
。
你所想的是.profile
。最初它是 bourne shell (sh) 的启动配置文件。如今,许多发行版都将其桌面环境设置为源代码.profile
。请注意,这也不是标准,但它似乎是一个约定。
Debian 用来源码.profile
通过图形登录来获取源码(截至 2013 年的维基页面)现在不(截至 2016 年的维基页面)。
拱门来源.xprofile
(截至 2013 年的维基页面)。
Ubuntu过去不鼓励使用.profile
(截至 2013 年的维基页面)现在它不再令人沮丧(截至 2016 年的维基页面)。
关于您的另一个问题:为什么我的 ~/.bash_profile 不起作用?这是预期的行为。
简而言之,该行为如下:
- bash 作为交互式登录 shell 启动:读取
~/.profile
- bash 作为交互式非登录 shell 启动:读取
~/.bashrc
有关更多详细信息,请参阅我在 askubuntu 中对类似问题的回答:https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc/132319#132319
答案3
尝试重新加载/source ~/.profile 文件时会出现几个问题。 [这里指的是 Ubuntu linux - 在某些情况下命令的细节会有所不同]
- 您是直接在终端还是在脚本中运行它?
- 你如何在脚本中运行这个?
广告。 1)
直接在终端中运行意味着不会创建子shell。因此您可以使用两个命令之一:
source ~/.bash_profile
或者
. ~/.bash_profile
在这两种情况下,这都会使用 .profile 文件的内容更新环境。
广告 2) 您可以通过调用以下命令来启动任何 bash 脚本
sh myscript.sh
或者
. myscript.sh
在第一种情况下,这将创建一个子 shell,它不会影响系统的环境变量,并且它们仅对子 shell 进程可见。完成 subshell 命令后,不会应用任何导出等。这是一个常见的错误,导致许多开发人员浪费大量时间。
为了使您在脚本中应用的更改对全局环境生效,必须使用以下命令运行脚本
.myscript.sh
命令。
为了确保您的脚本不在子 shell 中运行,您可以使用此函数。 (再次以 Ubuntu shell 为例)
#/bin/bash
preventSubshell(){
if [[ $_ != $0 ]]
then
echo "Script is being sourced"
else
echo "Script is a subshell - please run the script by invoking . script.sh command";
exit 1;
fi
}
我希望这可以消除一些常见的误解! :D 祝你好运!
答案4
简单的解决方案是将终端设为登录终端。对于默认配置文件“平铺和命令”下的 Gnome 终端,您可以选中“作为登录 shell 运行命令”框。这文章解释了登录 shell 和非登录 shell 之间的区别。