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


35

我正在使用Linux Mint。我的登录shell(cat /etc/passwd | grep myUserName)是bash。

在启动图形桌面环境并从中运行终端仿真器之后,我可以看到它.bash_profile不是源代码(其中设置的环境变量未export设置)。但是,如果我从一个文本控制台登录(ctrl+ alt+ F1)或手动运行bash -l从终端仿真器,.bash_profile工作正常。

我认为.bash_profile应该在X启动时export获取该资源并且从X运行的所有ed var应在终端中可用,我错了吗?

PS将所有内容.bashrc放进去并从中购买.bash_profile不是一个好主意(https://stackoverflow.com/questions/902946/):环境材料应仅获得一次。

Answers:


38

~/.bash_profile当它是登录shell时,文件将由bash读取。这就是您以文本模式登录时得到的。

在X下登录时,启动脚本由执行/bin/sh。在Ubuntu和Mint上,/bin/shdash而不是bash。Dash和Bash都具有相同的核心功能,但是短划线坚持了这些核心功能,以便变得既快又小,而Bash增加了很多功能,但需要更多资源。对于不需要额外功能的脚本,通常使用破折号;对于交互使用,bash则是常见的(尽管zsh 具有很多更好的功能)。

显示管理器的大多数组合读取和桌面环境(你在那里输入您的用户名和密码的程序)~/.profile从登录脚本/etc/X11/Xsession/usr/bin/lightdm-session/etc/gdm/Xsession或以适用者为准。因此,将环境变量定义放入中~/.profile。确保仅使用破折号支持的语法。

那你应该放在哪里呢?

  • .bash_profile加载.profile.bashrc如果外壳是交互式的,则加载。

    . ~/.profile
    if [[ $- == *i* ]]; then . ~/.bashrc; fi
  • 在中.profile,放入环境变量定义和其他会话设置,例如ulimit

  • 在中.bashrc,放置bash交互式设置,例如别名,函数,完成,键绑定(不在中.inputrc),…

另请参见登录外壳程序和非登录外壳程序之间的区别?.bashrc的替代


从一个答案中学到很多东西:)
mtk

16

.bash_profile是bash的启动配置脚本。没有标准的强制X源.bash_profile

你在想的是.profile。最初,它是bourne shell(sh)的启动配置文件。如今,许多发行版都将其桌面环境设置为源.profile。请注意,这也不是一个标准,但似乎是一个约定。

Debian过去.profile曾以图形化登录(2013年的Wiki页面)提供源代码,现在却没有(2016年的Wiki页面)。

.xprofile图形登录时的Arch资源(2013年的Wiki页面)。

Ubuntu过去不鼓励使用.profile截至2013年的wiki页面),现在不再劝阻(截至2016年的Wiki页面)。


关于另一个问题:为什么我的〜/ .bash_profile不起作用?那是预期的行为。

简而言之,行为如下:

  • bash作为交互式登录外壳开始: ~/.profile
  • bash作为交互式非登录外壳程序开始: ~/.bashrc

有关更多详细信息,请参见我对askubuntu中类似问题的回答:https ://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc / 132319#132319


1
其中有些是正确的,但“始终阅读~/.bashrc”是个坏建议:您应该.bashrc从交互式shell中阅读。您已经错过了这里的核心问题,即在X下登录时,没有bash的登录实例(在大多数显示管理器/桌面环境组合下,包括AntonioK的组合下)。
吉尔(Gilles)'所以

感谢您的反馈意见。我希望我的回答足够好,可以解决您的投诉。关于我的建议“始终阅读.bashrc”,我的意思是始终使用交互式外壳。我已经澄清了这一部分。我希望它不再引起误解。
lesmana

2
Ubuntu特别不鼓励使用.profilelink ”维基曾经(荒唐地)劝阻过这一点;已经修复。(/etc/profile对于系统范围的分配,仍然不建议注意,不建议向中添加脚本/etc/profile.d。).profile现在,建议将按用户文件显示为设置按用户环境变量的一种推荐方法:特定的用户(而不是整个系统)是〜/ .pam_environment〜/ .profile。”
伊利亚·卡根

关于Debian指定链接的页面,Debian不会~/.profile了图形登录和~/.xsessionrc应改为使用。
karora

感谢您的关注。Wiki页面已更新。我链接到它们在回答时的版本。
lesmana '18

2

尝试重新加载/获取〜/ .profile文件时会出现几个问题。[这指的是Ubuntu linux-在某些情况下,命令的详细信息将有所不同]

  1. 您是直接在终端还是在脚本中运行它?
  2. 您如何在脚本中运行它?

广告。1)

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

source ~/.bash_profile

要么

. ~/.bash_profile

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

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

sh myscript.sh 

要么

. myscript.sh

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

为了使您在脚本中应用的更改对全局环境生效,必须与该脚本一起运行

.myscript.sh

命令。

为了确保您的脚本未在子平台中运行,可以使用此功能。(同样的例子是针对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祝你好运!


1

在你的问题,你提到的https://stackoverflow.com/questions/902946/作为建议不要源,当接受的答案规定来

  • 将我的PATH设置放入.profile文件中(因为有时我会使用其他shell)
  • 将我的Bash别名和函数放入我的.bashrc文件中
  • 然后使用此[编辑:剪接代码注释]:

    .bash_profile

    #!/bin/bash
    # echo "Loading ${HOME}/.bash_profile"
    source ~/.profile # Get the paths
    source ~/.bashrc  # get aliases

.profile在Linux Mint上,将其全部放入都不适合我。使用.bashrc效果很好。


0

简单的解决方案是使终端成为登录终端。对于Gnome终端,在默认配置文件的“平铺和命令”下,可以选中“将命令作为登录外壳运行”框。文章解释了一个登录shell,一个是与否的关键。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.