我很难理解属于什么~/.profile
和属于什么~/.bashrc
。
从我读过的内容来看,在我看来~/.profile
应该用于环境变量和~/.bashrc
别名、函数等。如果我将我的所有export
陈述从~/.bashrc
移到~/.profile
,一切都会按原样工作,还是我要破坏某些东西?
(如果您想查看这两个文件,这是我的 dotfiles存储库。)
编辑 2022-06-03:我已经将我的大部分环境变量从~/.bashrc
to 移到~/.profile
并确保自己知道~/.bash_profile
sources ~/.profile
. 我留下的唯一环境变量~/.bashrc
是那些仅在我在 shell 中工作时才重要的环境变量,例如,与 less、提示、slrn 等有关的环境变量。一切似乎都运行良好。谢谢您的帮助。
它有助于了解在何时以及为什么获取哪些文件。
.profile
由启动时的登录 shell 提供。通常,您启动的唯一登录 shell 是您登录时启动的登录 shell,但您可以随时使用bash -l
. (另外,在 macOS 上,没有初始登录 shell,因此终端仿真器倾向于为每个新窗口运行一个登录 shell。).profile
是设置环境变量的理想场所,这些环境变量可以被从登录 shell 启动的任何程序继承。.bashrc
另一方面,它是由非登录交互式 shell 提供的,例如由终端窗口启动的那些。您可以在此处设置特定于交互式 shell 的东西,这些东西不是从父进程继承的。例如,PS1
这里设置是因为只有交互式 shell 关心它的值,任何交互式 shell.bashrc
无论如何都会 source,所以不需要定义和导出PS1
from.profile
。尽管您没有问,但值得指出
.profile
和之间的区别.bash_profile
。.profile
被所有 POSIX shell(例如dash
)“共享”,所以不要bash
在这里放任何特定的东西。.bash_profile
但是,仅由 使用bash
,因此您可以bash
在其中使用扩展名。如果.bash_profile
存在,.profile
将被忽略,因此如果出于任何原因您想同时使用两者,您可以添加. ~/.profile
到.bash_profile
.~/.profile
仅在您首次登录帐户时调用。您在此之后所做的任何更改,明智的做法是注销并重新登录,以便设置生效。~/.bashrc
每次启动终端窗口时都会调用。还有另一个profile
文件,它在/etc/
目录中。两者的主要区别在于,/etc/profile
当任何人登录系统~/.profile
时调用,而只有用户登录时调用。如果您的
export
行仅在终端会话中使用,那么我会将它们添加到~/.bashrc
文件中,因为它们仅在终端(bash)会话期间有效。但是,如果您希望它们在有或没有打开终端的情况下存在,请将它们添加到~/.profile
文件中,但就像@chepner 所说的那样,不要将特定于 bash 的命令放在~/.profile
文件中。如果您搞砸了这些文件,则
/etc/skel/
目录中存储有默认文件,您可以将这些文件复制回您的主目录。此外,/etc/skel/
当您启动到 LiveUSB/CD/DVD 时,也会使用这些文件,因此如果您在实时媒体上修改这些文件,然后当它完成启动时,您可以设置自己的变量。chepner 的回答涵盖了总体原则。您还需要注意其他一些细微之处。
首先,即使是交互式的,登录 shell 也不会提供源代码。
.bashrc
因此,您可能需要一个.bash_profile
包含如下代码的代码:这不会对控制台登录到图形环境产生太大影响,但会对文本控制台或 ssh 登录产生很大影响。
您不一定需要进行交互式测试;实际上,我
.bashrc
什至为非交互式 shell 采购(尽管在某些情况下这可能不是一个好主意)。请注意,如果您也使用非 Bash shell,您还需要一个
.profile
带有您想要的任何环境变量等的 a。.profile
当您拥有 时, Bash 会忽略您的.bash_profile
,但当然后者可以获取前者。并非每个新登录(即不是由您的用户 ID 而是由已验证您身份的根进程创建的 shell)都被视为“登录 shell”。特别是,向 ssh 调用 (
ssh somehost.example.com 'echo $-'
) 发出命令将不是“登录 shell”,并且//.bash_profile
不会被获取。这是一个表格,显示了被认为是“登录”或交互式 shell 以及为各种调用执行的内容.bash_login
.profile
argv[0][0] == '-'
,--login
-i
, 标准输入是 tty/etc/profile
然后是~/.bash_profile
,~/.bash_login
,~/.profile
/etc/bash.bashrc
然后~/.bashrc
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 $-
)该表来自本文档;那里有一些可能也有用的进一步信息。(任何觉得这个答案应该有什么东西的人都应该随时编辑并复制它。)