我想获得别名的扩展。
例如,如果我有:
alias g=hub
alias cdh='cd $HOME'
我希望有:
expand_alias g
==hub
expand_alias cdh
==cd $HOME
棘手的是两个 shell 有不同的输出: bash:
$ alias g cdh
alias g='git'
alias cdh='cd $HOME'
兹什:
% alias g cdh
g=hub
cdh='cd $HOME'
注意alias
周围没有前缀和引号hub
。
答案1
在 中zsh
,您可以使用
get_alias() {
printf '%s\n' $aliases[$1]
}
使用bash
(假设它不处于 POSIX 模式,在这种情况下它alias
会给出类似于 的输出zsh
),您可以这样做:
get_alias() (
eval '
alias() { printf "%s\n" "${1#*=}"; }'"
$(alias -- "$1")"
)
alias
基本上,我们评估重新定义为函数后的输出,该函数打印第一个参数中alias
第一个右侧的内容。=
您可以使用类似的方法来兼容大多数 POSIX shell,zsh
并且bash
:
get_alias() {
eval "set -- $(alias -- "$1")"
eval 'printf "%s\n" "${'"$#"'#*=}"'
}
答案2
基于斯特凡·查泽拉斯的回答,我想出了:
function alias_expand {
if [[ $ZSH_VERSION ]]; then
# shellcheck disable=2154 # aliases referenced but not assigned
[ ${aliases[$1]+x} ] && printf '%s\n' "${aliases[$1]}" && return
else # bash
[ "${BASH_ALIASES[$1]+x}" ] && printf '%s\n' "${BASH_ALIASES[$1]}" && return
fi
false # Error: alias not defined
}
(使用 bash 4.0 或更高版本)。
答案3
定义一个 shell 函数怎么样:
EXA() { alias $@ | sed 's/^/expand_/; s/=/ == /; s/\o047//g; '; }
答案4
在我的 zsh 环境中,当我alias
不输入任何命令时,我会得到stdout
所有别名的列表。同样的情况也发生在 bash 中(在 MacOS 上)。这些都是形式alias=expansion
因此,您可以使用 sed 进一步过滤:alias | sed -ne 's/cdh=\(.*\)$/\1/p'
如果“cdh”是您想知道的别名。如果这对您来说是一项常见任务,您可以在您的配置文件中为此创建一个 shell 函数:例如
expand_alias() { alias $@ | sed -ne 's/^'$@'=\(.*\)$/\1/p' }