在.bashrc中包含其他文件

102

我有一些想在 .bashrc 中执行的东西,但我希望它存在于系统上的另一个文件中。我该如何将此文件包含到 .bashrc 中?


这个问题应该发布在Unix&Linux Stack Exchange上吗? - Cale Sweeney
5个回答

146
source /whatever/file(或. /whatever/file)添加到.bashrc文件中,您可以在其中包含其他文件。

23
你应该优雅地处理不存在的情况,例如,要么检查文件是否存在(test -r path && . path),要么忽略错误(. path 2> /dev/null)。 - William Pursell
3
在我看来,先进行一次测试,然后编写针对那些99.99%永远不会发生的情况的代码要容易得多。 - Daniel
6
@Daniel 我不同意。发生在0.01%的事件可能每秒发生数千次。而在NFS挂载的$HOME上拥有.bashrc可能意味着文件源的失败率要比0.01%高得多。 - William Pursell

78
为了避免错误,您需要先检查文件是否存在。然后再引用该文件。可以像这样进行操作。

为了避免错误,您需要先检查文件是否存在。然后再引用该文件。可以像这样进行操作。

# include .bashrc if it exists
if [ -f $HOME/.bashrc_aliases ]; then
    . $HOME/.bashrc_aliases
fi

4
在.bashrc_aliases或者我正在引用的任何文件的结尾,我会输出以下语句:echo "别名已加载" - Nick
2
我心里想:“~ 就是 $HOME,对吧?”可惜,if [ -f ~/.bashrc_aliases ]; 不起作用。 - modle13

16

这是一句简短的话!

[ -f $HOME/.bashrc_aliases ] && . $HOME/.bashrc_aliases

有趣的事实:Shell(以及大多数其他编程语言)是懒惰的。如果一系列条件被连接起来并用连词(也称为“and”,即 &&)联系在一起,则评估将从左到右开始。当其中一个条件为假时,其余表达式将不会被评估,有效地“短路”了其他表达式。

因此,你可以将要执行的命令放在条件的右侧,只有在左侧的每个条件都被评估为“true”时才会执行。


2
如果您有多个要加载的文件,这些文件可能存在也可能不存在,您可以使用for循环使其更加优雅。
files=(somefile1 somefile2)
path="$HOME/path/to/dir/containing/files/"
for file in ${files[@]}
do 
    file_to_load=$path$file
    if [ -f "$file_to_load" ];
    then
        . $file_to_load
        echo "loaded $file_to_load"
    fi
done

输出结果应如下所示:
$ . ~/.bashrc
loaded $HOME/path/to/dir/containing/files/somefile1
loaded $HOME/path/to/dir/containing/files/somefile2

你肯定不需要在循环内再次检查文件是否存在吧?(除非你的磁盘上有非常动态的文件列表) - John Mark Scarborough
只有一个检查文件是否存在的方法。如果您当前的工作环境中没有列表中描述的文件,则会在加载该文件时出现错误并产生视觉噪音。更理想的方法是获取文件列表,然后循环遍历,而不是定义静态列表。 - modle13

0

我更喜欢先检查版本,然后为路径配置分配变量:

if [ -n "${BASH_VERSION}" ]; then
  filepath="${HOME}/ls_colors/monokai.sh"
  if [ -f "$filepath" ]; then
    source "$filepath"
  fi
fi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接