我的 .bashrc 变得有点长,所以我决定根据主题将其分成更小的文件,然后从 .bashrc 中调用这些文件,如下所示
#my long .bashrc file
bash .topic1rc
bash .topic2rc
但是,在这些子脚本之一中,我创建了一个 bash 函数。不幸的是,它不再像我将所有内容分解成块之前那样对我可用。如何将我的 .bashrc 文件分成多个块,但保留对我创建的变量和函数的访问权限?
答案1
如果我正确理解你的问题,你需要source
或.
你的文件。例如,在您的.bashrc
并维护订单中(只有您知道):
source .topic1rc
source .topic2rc
source
.
为了便于使用,可以缩短为在命令行上 - 这是完全相同的命令。的作用source
是有效地内联被调用的脚本。
答案2
您所做的不起作用,因为每个bash .topic1rc
进程都会调用一个新的 bash shell 作为子进程,并且无法通信环境、shell 变量或函数后退到父进程,即您感兴趣的 bash shell。
您想要做的是使用该.
命令(也可以使用更详细的命令source
- 任一命令都执行相同的操作)。这会在当前 shell 中读取给定的脚本,而不是读取到新 shell 中。所以:
#my long .bashrc file
. ~/.topic1rc
. ~/.topic2rc
(对于几乎所有省略路径的用途来说,它可能都可以正常工作,因为 main~/.bashrc
通常在您登录时执行,并且您的主目录是您的初始工作目录,但最好将其拼写出来。)
答案3
正如其他人所解释的,您正在一个新的 shell 中运行这些脚本,该 shell 在运行后就会终止。您需要使用以下任一方式获取文件来源
. .topic1rc
或者
source .topic1rc
您还可以创建一个稍微更高级的解决方案,如果您想添加更多内容,则不需要编辑 .bashrc块将来。
您可以将所有配置文件放在一个目录下,例如~/.bash.d
,然后将其作为.bashrc
文件的唯一内容:
if [[ -d ~/.bash.d ]]
then
for conf_file in ~/.bash.d/*
do
if [[ -f $conf_file ]]
then
source "$conf_file"
fi
done
fi
这样,.bash.d 下的所有 bash 配置文件都会被获取,并且您可以控制发生这种情况的顺序,因为它们将按文件名的字母顺序获取。
答案4
请注意,当您使用source
或.
命令时,默认情况下,在 bash 中,将在 中搜索文件参数,$PATH
除非它包含/字符。你想要
source ./.topic1rc
或者
shopt -u sourcepath
source .topic1rc