如何在 bash 中获取递归别名?

How to get recursive aliases in bash?

我有多个 aliases 由于处理了一些拼写错误而被别名为一个通用别名。请注意,我在 zsh shell 中使用 which 并在 bash.

中使用 type

例如:

alias netlab="ssh user@IP_ADDRESS"
alias n=netlab
alias ne=netlab
alias net=netlab
alias nn=netlab

当我尝试获取别名的类型时,我得到以下信息:

$ which -sa n  # in ZSH-shell
n: aliased to netlab

$ type n  # in BASH-shell
n is an alias for netlab

因为netlab也有别名,我也可以得到吗?所以基本上,我想递归地应用 which program

我想要的示例输出:

$ type n  # in BASH-shell 
n: aliased to netlab
netlab: aliased to ssh user@IP_ADDRESS

或者只是返回其最新的别名:

$ type n
n: aliased to ssh user@IP_ADDRESS

您可以使用大括号扩展将多个名称作为同一个字符串的别名:

alias {netlab,n,ne,net,nn}="ssh user@IP_ADDRESS"

别名集未传递到 bash 脚本中。您可以使用 source 访问别名,然后使用 type 循环直到找到真正的命令。我无法想象 运行 使用 source 的脚本会很方便。

但是,您可以使用 bash 脚本和符号链接来实现与您的别名相同的结果。

以下假设 $HOME/bin 在您的 PATH 上。

cat < $HOME/bin/netlab ssh 用户@IP_ADDRESS EOF

ln -s $HOME/bin/netlab $HOME/bin/n ln -s $HOME/bin/netlab $HOME/bin/ne ln -s $HOME/bin/netlab $HOME/bin/net ln -s $HOME/bin/netlab $HOME/bin/nn

现在使用任何新的“别名”都将调用原始脚本。