为什么别名在主 shell 中可用,但在子 shell 中不可用?

为什么别名在主 shell 中可用,但在子 shell 中不可用?

我正在阅读一些文字,其中指出:

每次生成 BASH shell 时(例如运行 shell 脚本时),实际上都会执行 .bashrc shell 配置文件。换句话说,每次创建子 shell 时,都会执行 .bashrc 文件。这可以导出您在 .bashrc shell 初始化文件中定义的任何局部变量或别名。

我还读到,每次我执行一个 shell 脚本(比如说脚本1),则创建一个子 shell。因此,当创建这个子 shell 时,.bashrc文件必须执行,因此别名定义在.bashrc必须在子 shell 中可用(但实际上不可用)。如果别名在此子 shell 中不可用,那么它们如何在主 shell(我通过它执行我的脚本)中可用?

答案1

是的,在 Linux 的 bash shell 中你可以说

source /path/to/my_lib.sh

用于从文件加载别名定义。或者,为了降低复杂性,您可以简单地将该别名定义复制到 bash 脚本中。

但等等!这只会创建别名,可能带有

alias foo3 foo9  # describe these two aliases: declare errors if one doesn't exist

您将享受新的别名定义,但是在启用别名扩展之前运行它们将会失败:

shopt -s expand_aliases # alias xpn ON

另请考虑:

shopt -u expand_aliases # alias xpn OFF

或者

shopt  expand_aliases   # query whether

或者

unalias foo3 foo9 # delete these aliases 

答案2

如果您已定义别名script1.sh并且希望它们在任何地方都可用,请添加到您的.bashrc文件中:

source /path/to/script1.sh

或者:

. /path/to/script1.sh

为了避免脚本不存在时出现错误,您可以使用:

if [ -f /path/to/script1.sh ]; then source /path/to/script1.sh; fi

对于您在 中定义的任何函数同样适用script1.sh

相关内容