为什么我的 ~/.bash_profile 不起作用?

为什么我的 ~/.bash_profile 不起作用?

我正在使用 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),...

也可以看看登录 Shell 和非登录 Shell 之间的区别?.bashrc 的替代方案

答案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. 您是直接在终端还是在脚本中运行它?
  2. 你如何在脚本中运行这个?

广告。 1)

直接在终端中运行意味着不会创建子shell。因此您可以使用两个命令之一:

source ~/.bash_profile

或者

. ~/.bash_profile

在这两种情况下,这都会使用 .profile 文件的内容更新环境。

广告 2) 您可以通过调用以下命令来启动任何 bash 脚本

sh myscript.sh 

或者

. myscript.sh

在第一种情况下,这将创建一个子 shell,它不会影响系统的环境变量,并且它们仅对子 shell 进程可见。完成 subshel​​l 命令后,不会应用任何导出等。这是一个常见的错误,导致许多开发人员浪费大量时间。

为了使您在脚本中应用的更改对全局环境生效,必须使用以下命令运行脚本

.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 之间的区别。

相关内容