~/.profile 和 ~/.bashrc 中有什么?

~/.profile 和 ~/.bashrc 中有什么?

我无法理解什么属于~/.profile,什么属于~/.bashrc

据我所知,大部头书应该~/.profile用于环境变量、~/.bashrc别名、函数等。如果我将所有export语句从~/.bashrc移到~/.profile,一切都会正常工作吗?还是我会破坏某些东西?

(这里我的 dotfiles 仓库如果您想查看这两个文件。)

编辑2022-06-03:我已将大部分环境变量从 移至 ,~/.bashrc~/.profile已确保 sources ~/.bash_profile~/.profile我留下的唯一环境变量~/.bashrc是那些仅在我在 shell 中工作时才重要的变量,例如与 less、提示、slrn 等相关的变量。一切似乎都运行良好。谢谢您的帮助。

答案1

它有助于了解哪些文件在何时被获取以及为什么

.profile由启动时的登录 shell 提供。通常,您启动的唯一登录 shell 是您登录时启动的,但您可以随时使用 运行登录 shell bash -l。(此外,在 macOS 上,没有初始登录 shell,因此终端仿真器倾向于为每个新窗口运行一个登录 shell。)

.profile是设置环境变量的理想位置,这些环境变量可以被从登录 shell 启动的任何程序继承。

.bashrc另一方面,是由非登录交互式 shell 提供的,例如由终端窗口启动的 shell。这是您设置内容的地方具体的到交互式 shell,这些权限不会从父进程继承。例如,PS1此处设置是因为仅有的交互式 shell 关心它的值,并且任何交互式 shell.bashrc无论如何都会进行源操作,因此无需定义并PS1从中导出.profile

虽然您没有询问,但值得指出这里.profile和之间的区别.bash_profile.profile由所有 POSIX shell(例如dash)“共享”,因此不要bash在此处放置任何特定于的内容。.bash_profile但是,仅由使用bash,因此您可以bash在其中使用扩展。 如果.bash_profile存在,.profile将被忽略,因此如果出于某种原因您想同时使用两者,则可以将其添加. ~/.profile到 的顶部.bash_profile

答案2

~/.profile仅在您首次登录帐户时调用。此后所做的任何更改最好注销并重新登录,以使设置生效。 ~/.bashrc每次启动终端窗口时都会调用。还有另一个profile文件,它位于/etc/目录中。两者之间的主要区别在于,/etc/profile当任何人登录系统时都会调用,而~/.profile只有用户登录时才会调用。

如果您的export行仅在终端会话中使用,那么我会将它们添加到文件中~/.bashrc,因为它们仅在终端 (bash) 会话期间有效。但是,如果您希望它们在打开或关闭终端的情况下都存在,请将它们添加到文件中~/.profile,但如 @chepner 所述,不要将特定于 bash 的命令放入~/.profile文件中。

如果您搞砸了这些文件,目录中会存储默认文件/etc/skel/,您可以将这些文件复制回主目录。此外,/etc/skel/当您启动到 LiveUSB/CD/DVD 时也会使用这些文件,因此如果您在实时媒体上修改这些文件,然后在启动完成时,您可以设置自己的变量。

答案3

chepner 的回答涵盖了总体原则。还有一些其他细节需要注意。

首先,登录 shell 会不是源代码.bashrc,即使它们是交互式的。因此,您可能需要.bash_profile包含如下代码:

interactive() { [[ $- = *i* ]]; }
interactive && . $HOME/.bashrc || echo 1>&2 "ERROR: .bashrc failed with retval $?"

这对于控制台登录图形环境不会产生太大影响,但对于文本控制台或 ssh 登录会产生很大影响。

您不一定需要进行交互式测试;实际上我.bashrc甚至为非交互式 shell 进行了搜索(尽管在某些情况下这可能不是一个好主意)。

请注意,如果您还使用非 Bash shell,那么您还需要一个.profile以及您想要的任何环境变量等。.profile当您有 时,Bash 将忽略您的.bash_profile,但后者当然可以获取前者。


并非每个新登录(即不是由您的用户 ID 创建的 shell,而是由已验证您的 root 进程创建的 shell)都被视为“登录 shell”。特别是,向 ssh 调用发出命令(ssh somehost.example.com 'echo $-')将不是是“登录 shell”,并且.bash_profile/ .bash_login/.profile不会被引用。下表显示了什么被视为“登录”或交互式 shell,以及针对各种调用执行的内容

状态 调用
登录 (大号 argv[0][0] == '-'--login
交互的 ( -i,stdin 是 tty
偏僻的 (R stdin 是“网络连接”(见下文)
  • '•' = 设置;空白 = 未设置;'-' = 未选中或不关心。
  • 抑制物:从父级(除 init 之外)继承环境;即,它不是“全新登录”,并且父级可能希望环境保持完整。
  • :/etc/profile 然后首先是来源~/.bash_profile,,~/.bash_login~/.profile
  • rc: 消息/etc/bash.bashrc来源~/.bashrc
大号 R 抑制物 rc 例子
- ssh host.com(sshd 设置 argv[0]="-bash")
- ssh host.com </dev/null(sshd 设置 argv[0]="-bash")
bash -ibash在 tty 上
bash hello.sh,,bash -c echo foo
ssh host.com 'echo $-'(ssh 运行bash -c 'echo $-

该表格来自这个文件;那里还有一些可能有用的信息。(任何觉得这个答案中应该有内容的人都可以随意编辑并复制它。)

相关内容