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

MDe*_*usk 35 .profile bashrc

我很难理解什么属于~/.profile以及什么属于~/.bashrc

根据我所读到的内容,在我看来,它~/.profile应该用于环境变量以及~/.bashrc别名、函数等。如果我将所有export语句从~/.bashrc移至~/.profile,一切是否都会按预期进行,或者我是否会破坏某些内容?

(如果您想查看这两个文件,这是我的 dotfiles 存储库。)

编辑 2022-06-03:我已将大部分环境变量从~/.bashrc移至~/.profile,并向自己保证~/.bash_profile来源~/.profile. 我留下的唯一环境变量~/.bashrc是那些仅在我在 shell 中工作时才重要的环境变量,例如,与 less、提示符、slrn 等相关的环境变量。一切似乎都进展顺利。谢谢您的帮助。

che*_*ner 38

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

.profile由启动时的登录 shell 获取。通常,您启动的唯一登录 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.


Ter*_*nce 16

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

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

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

  • 原来的答案实际上更好,技术性较低,更直接地回答了问题,即在“.profile”中放置什么以及在“.bashrc”中放置什么。 (2认同)

cjs*_*cjs 12

切普纳的回答涵盖了总体原则。您还需要注意其他一些微妙之处。

\n

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

\n
interactive() { [[ $- = *i* ]]; }\ninteractive && . $HOME/.bashrc || echo 1>&2 "ERROR: .bashrc failed with retval $?"\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

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

\n
\n

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

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
状态祈求
登录 ( L )argv[0][0] == \'-\',--login
互动(-i, 标准输入是 tty
远程(Rstdin 是“网络连接”(见下文)
\n
\n
    \n
  • \'\xe2\x80\xa2\' = 设置;空白=未设置;\'-\' = 未检查或不关心。
  • \n
  • inh:从父级(除了 init 之外)继承环境;\n即,它不是“全新登录”,并且父级可能期望\n环境保持完整。
  • \n
  • p : 来源/etc/profile\n然后第一个~/.bash_profile, ~/.bash_login,~/.profile
  • \n
  • rc/etc/bash.bashrc :那么来源~/.bashrc
  • \n
\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
L因赫pRC例子
\xe2\x80\xa2\xe2\x80\xa2-\xe2\x80\xa2ssh host.com(sshd 设置 argv[0]="-bash")
\xe2\x80\xa2-\xe2\x80\xa2ssh host.com </dev/null(sshd 设置 argv[0]="-bash")
\xe2\x80\xa2\xe2\x80\xa2\xe2\x80\xa2bash -i,bash在 tty 上
\xe2\x80\xa2bash hello.sh, bash -c echo foo,
\xe2\x80\xa2\xe2\x80\xa2ssh host.com \'echo $-\'(ssh 运行bash -c \'echo $-
\n
\n

该表来自该文档;那里有一些可能也有用的进一步信息。(任何觉得这个答案应该包含某些内容的人都可以随意编辑并复制它。)

\n

  • 这很有趣。我不知道 ssh 会话。谢谢。 (2认同)