我无法理解什么属于~/.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 -i ,bash 在 tty 上 |
|||||
• | bash hello.sh ,,bash -c echo foo |
|||||||
• | • | ssh host.com 'echo $-' (ssh 运行bash -c 'echo $- ) |
该表格来自这个文件;那里还有一些可能有用的信息。(任何觉得这个答案中应该有内容的人都可以随意编辑并复制它。)