据我了解,在 Bash 下,/etc/profile
、~/.profile
、 和~/.bash_profile
用于跨子进程和子 shell(主要是环境变量)持续存在的设置,而/etc/bashrc
和 则~/.bashrc
用于不存在的设置。由于我非常确定 Bash 完成设置不会被继承,因此我希望它们始终位于后一组文件中,但我发现了几个实例,其中可能更有知识的人已经放置了它们或鼓励放置它们在“配置文件”文件中:
在 Ubuntu 上(自 20.04 起),安装
bash-completion
包会添加一个文件/etc/profile.d/
(来源为/etc/profile
),该文件提供主 Bash 完成脚本。自制的
bash-completion
公式建议用户:Add the following line to your ~/.bash_profile: [[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh"
我对这些软件包使用配置文件的原因的最佳猜测是为了补偿那些没有~/.bashrc
在其配置文件中获取其源的用户,但是当您考虑(至少在 Ubuntu 上)默认源~/.profile
和~/.bashrc
默认源~/.bashrc
时,这就没有意义了包含一个用于获取主要 Bash 完成脚本(如果存在)的部分(我认为这意味着默认情况下该脚本最终会在登录 shell 中获取两次?)。此外,在大多数 Linux 桌面上,配置文件是在登录时获取的,然后用户的 GUI 桌面启动,然后该 GUI 中的任何终端仿真器都会启动非登录 shell,因此,如果您在 Linux 桌面上使用终端仿真器,则有可能配置文件是否未在该 shell 中获取。
为什么这些包将完成脚本作为配置文件而不是 bashrc 文件的一部分?这样做有什么好处呢?