我的别名解析器在命令行上运行,但不能在脚本中运行

我的别名解析器在命令行上运行,但不能在脚本中运行

我正在尝试创建一个简单的脚本,它将所有别名转储到 bash 启动时可以加载的文件中,同时确保 -to popd 的别名正常工作:

alias -p | sed 's/alias -=/alias -- -=/' > ~/.bash_aliases

如果我在命令行上运行它,它似乎可以工作,但是如果我将它放入脚本中并运行它(在#!/bin/bash顶部和chmod +x),我会得到一个空文件。有人能告诉我我错过了哪些 bash 知识吗?

如果重要的话,我正在使用 bash v4.2.10。

答案1

shell 脚本继承调用程序的环境变量等,但它不继承别名和命令历史记录等内容。

如果您的所有别名都位于一个公共位置,例如~/.bashrc,您可以首先将该文件源到您的脚本中:

. $HOME/.bashrc

然后,在该 shell 脚本的执行上下文中,您将拥有该文件中定义的所有别名.bashrc

如果您的别名定义得到处都是,那么就没有简单的方法来合并它们。您必须将“保存我所有的别名”编写为函数。您可以在您的 中添加类似的内容~/.bash_profile,例如:

function dumpalias {
    alias -p | sed 's/alias -=/alias -- -=/' > ~/.bash_aliases
}

然后,注销并重新登录后,您可以说dumpalias获得您想要的行为。

答案2

当您将其放入脚本并执行它时,您将启动一个新的 shell,它不会从当前 shell 继承别名。所以,脚本保存 shell 的别名;只是执行这些命令的 shell 中没有定义任何别名。

你可以来源在当前 shell 中执行它的脚本:

. /path/to/script

或者,您可以将其写为外壳函数

相关内容