这个问题已经在这里有了答案:
这是令人尴尬的,但经过多年的使用POSIX系统充分的时间,我仍然有一个很难搞清楚,如果一个shell定制应该进去.bashrc
,.profile
或者别的地方。更不用说某些特定于OS的配置文件了.pam_environment
。
是的,我知道如何困惑文档并了解何时加载或不加载每个文件。我想知道的是,是否有人将如何确定将给定类型的自定义内容放入哪个文件的综合指南综合在一起。
这个问题已经在这里有了答案:
这是令人尴尬的,但经过多年的使用POSIX系统充分的时间,我仍然有一个很难搞清楚,如果一个shell定制应该进去.bashrc
,.profile
或者别的地方。更不用说某些特定于OS的配置文件了.pam_environment
。
是的,我知道如何困惑文档并了解何时加载或不加载每个文件。我想知道的是,是否有人将如何确定将给定类型的自定义内容放入哪个文件的综合指南综合在一起。
Answers:
TL; DR:
~/.bash_profile
应该是非常简单的,并且只需按以下顺序加载.profile
和
.bashrc
~/.profile
具有与bash无关的东西,例如环境变量(PATH
和朋友)
~/.bashrc
在交互式命令行中具有您想要的任何内容。命令提示符,EDITOR
变量,bash别名供我使用
其他一些注意事项:
图形应用程序应该可用的任何东西或sh(或bash调用为sh
)必须存在~/.profile
~/.bashrc
不得输出任何东西
任何仅适用于登录Shell的内容都应放入 ~/.profile
确保~/.bash_login
不存在。
~/.profile
为显式运行/ bin / sh的GDM / LightDM / LXDM等服务正确设置环境。
.bashrc
输出很多东西,您能对此发表评论吗?特别是,应将问候语输出放在哪里?
[[ $- == *i* ]]
,即在特殊$-
变量中寻找“ i” 。当然,仅在将bash编译为.bashrc
以非交互模式读取的系统上,它才是最重要的。(也就是说,Debian的,但不是凯旋门。),但它尝试使用连接时,神秘的错误消息的常见原因sftp
或scp
或类似的工具。
.bash_profile
和相同.profile
。但是bash只读取三分之一中的第一个。意思是,如果您有一个.bash_login
,则.profile
和.bash_profile
都将被神秘地忽略。
在过去的几年中,我有很多的时间可以浪费,所以我已经研究了这个比仅有10分钟多一点。我不知道这是否是最好的布局,它只是在几乎所有情况下都能正常工作的布局。
要求:
~/.profile
必须与任何/ bin / sh兼容-包括bash,dash,ksh以及发行版可能选择使用的其他任何东西。
环境变量必须放在控制台登录名(即“登录” shell)和图形登录名(即,诸如GDM,LightDM或LXDM之类的显示管理器)均可读取的文件中。
同时拥有 ~/.profile
和几乎没有意义~/.bash_profile
。如果缺少后者,bash将很乐意使用前者,并且可以使用$BASH
或来保护任何特定于bash的行$BASH_VERSION
。
*profile
和之间的区别*rc
是,前者用于“登录” shell,后者在您每次打开终端窗口时使用。但是,“登录”模式下的bash无法提供~/.bashrc
,因此~/.profile
需要手动进行。
在最简单的配置是:
有一个~/.profile
设置所有环境变量(特定于bash的变量除外)的,也许打印一行或两行,然后~/.bashrc
如果由bash运行则打印源,否则坚持使用与sh兼容的语法。
出口TZ =“欧洲/巴黎” 导出EDITOR =“ vim” 如果[“ $ BASH”]; 然后 。〜/ .bashrc 科幻 正常运行时间
有一个~/.bashrc
可以执行任何特定于外壳程序的安装程序,并通过检查交互模式来避免破坏sftp
Debian(在Debian上编译bash并提供~/.bashrc
即使对于非交互外壳程序也可以加载的选项):
[[$-== * i *]] || 返回0 PS1 ='\ h \ w \ $' start(){sudo服务“ $ 1” start; }
但是,还有一个问题是某些非交互式命令(例如ssh <host> ls
)会跳过~/.profile
,但是环境变量对它们非常有用。
某些发行版(例如Debian)会编译其bash,并提供源于~/.bashrc
此类非交互式登录的选项。在这种情况下,我发现将所有环境变量(各export ...
行)移动到单独的文件~/.environ
,并从和两者中获取 它很有用,可以避免两次执行:.profile
.bashrc
如果![“ $ PREFIX”]; 那么 #$或编辑,或$ TZ,还是...... 。〜/ .environ #通常,.environ本身会设置的任何变量 科幻
不幸的是,对于其他发行版(例如Arch),我还没有找到一个很好的解决方案。一种可能性是使用(默认情况下启用的)pam_env PAM模块,方法如下~/.pam_environment
:
BASH_ENV =。/。environ #不是错字;它必须是一条道路,但〜无效
然后,当然,更新~/.environ
为unset BASH_ENV
。
结论?贝壳是一种痛苦。环境变量很痛苦。特定于发行版的编译时选项给您带来极大的痛苦。
.profile
和.bashrc
从.bash_profile
并保持.profile
清洁。
.profile
很干净,谢谢。
~/.profile
和几乎没有意义~/.bash_profile
”:我不同意。有关原因,请参见丹的答案。
.profile
并bash
用条件保护特定部分是很好的。
看看ShreevatsaR撰写的这篇优秀博客文章。这是摘录,但转至博客文章,其中包括对“登录外壳”等术语的解释,流程图和类似的Zsh表。
对于Bash,它们的工作方式如下。读取适当的列。执行A,然后执行B,然后执行C,依此类推。B1,B2,B3表示仅执行找到的那些文件中的第一个。
+----------------+-----------+-----------+------+
| |Interactive|Interactive|Script|
| |login |non-login | |
+----------------+-----------+-----------+------+
|/etc/profile | A | | |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc| | A | |
+----------------+-----------+-----------+------+
|~/.bashrc | | B | |
+----------------+-----------+-----------+------+
|~/.bash_profile | B1 | | |
+----------------+-----------+-----------+------+
|~/.bash_login | B2 | | |
+----------------+-----------+-----------+------+
|~/.profile | B3 | | |
+----------------+-----------+-----------+------+
|BASH_ENV | | | A |
+----------------+-----------+-----------+------+
| | | | |
+----------------+-----------+-----------+------+
| | | | |
+----------------+-----------+-----------+------+
|~/.bash_logout | C | | |
+----------------+-----------+-----------+------+
/etc/profile
电话/etc/bash.bashrc
,和~/.profile
电话~.bashrc
。如此有效,/etc/bash.bashrc
并且~/.bashrc
也正在针对交互式登录执行。
/bin/sh
BASH_ENV
)。可以通过搜索找到bash手册页的相关段落If bash is invoked with the name sh
。
我为您提供“综合”指南:
.bash_profile
并.profile
加载(.bashrc
如果存在),例如
[ -r $HOME/.bashrc ] && source $HOME/.bashrc
.bashrc
。编辑:在“全面”中添加了恐吓引号,以防万一有人想相信它。;)
.bash_profile
和.profile
有点多余;您只需要后者。不过,您确实需要使其具有/ bin / sh-proof的能力,if [ "$BASH" ] && [ -r ~/.bashrc ]; then . ~/.bashrc; fi
因为有些程序(即gdm / lightdm)可以从/ bin / sh脚本手动获取文件。这也意味着保持环境.bashrc
无效。不得不为-1,因为您的“综合”准则在许多系统上均不起作用,正如我多次发现的困难方式。
我放弃了尝试弄清楚这一点的想法,~/.shell-setup
而是制作了一个脚本(),我从所有其他脚本中获取了该脚本。
此方法需要~/.shell-setup
具有两个功能:
#1是相当标准的,尽管可能在shell脚本中使用不多。
#2比较棘手。这是我在bash中使用的:
if [ "" == "$BASH_EXECUTION_STRING" -a "" == "$DESKTOP_SESSION" ]; then
echo "Hello user!" # ... etc
fi
不幸的是,我不记得我是怎么想出来的,或者为什么仅仅检测交互式shell是不够的。
放入所有内容.bashrc
,然后.bashrc
从中获取.profile
从bash手册页(在OS X 10.9上):
启动不是登录外壳程序的交互式外壳程序时,如果该文件存在,则bash从〜/ .bashrc读取并执行命令。使用--norc选项可以禁止这种情况。--rcfile file选项将强制bash从文件而不是〜/ .bashrc中读取并执行命令。
以上是所有内容都放入其中的原因.bashrc
。但是,在处理登录Shell时会有一些不同的行为。再次引用手册页:
当bash作为交互式登录shell或具有--login选项的非交互式shell被调用时,它首先从文件/ etc / profile中读取并执行命令(如果该文件存在)。读取该文件后,它将按该顺序查找〜/ .bash_profile,〜/ .bash_login和〜/ .profile,并从存在且可读的第一个命令中读取并执行命令。启动外壳程序时,可以使用--noprofile选项禁止此行为。
.profile
为登录外壳读取,但.bashrc
不是。复制所有内容.bashrc
都是bad™,因此我们需要提供其来源.profile
以使行为保持一致。
但是,你不想源.bashrc
从.profile
无条件。请查看评论和其他答案以获取更多详细信息。
.bashrc
从来源.profile
。请参阅@DanRabinowitz的答案。
[ -n "$BASH" -a -f ~/.bashrc ] && . ~/.bashrc
会是一个不错的选择.profile
。