如何使 bash 脚本中创建的函数像 .bashrc 中的函数一样持久存在?

如何使 bash 脚本中创建的函数像 .bashrc 中的函数一样持久存在?

我的 .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

相关内容