获取别名的扩展(在 bash 和 zsh 中)

Tom*_*ale 6 shell bash zsh alias

我想获得别名的扩展。

例如,如果我有:

alias g=hub
alias cdh='cd $HOME'
Run Code Online (Sandbox Code Playgroud)

我希望有:

expand_alias g == hub

expand_alias cdh == cd $HOME

棘手的是两个shell有不同的输出:bash:

$ alias g cdh
alias g='git'
alias cdh='cd $HOME'
Run Code Online (Sandbox Code Playgroud)

zsh:

% alias g cdh
g=hub
cdh='cd $HOME'
Run Code Online (Sandbox Code Playgroud)

注意没有alias 前缀,也没有引号hub

Sté*_*las 6

zsh,你可以使用

get_alias() {
  printf '%s\n' $aliases[$1]
}
Run Code Online (Sandbox Code Playgroud)

使用bash(假设它不在 POSIX 模式下,在这种情况下它alias会给出类似于zsh's的输出),您可以执行以下操作:

get_alias() (
  eval '
    alias() { printf "%s\n" "${1#*=}"; }'"
    $(alias -- "$1")"
)
Run Code Online (Sandbox Code Playgroud)

基本上,我们评估aliasafter 重新定义alias为一个函数的输出,该函数打印第=一个参数中第一个右侧的内容。

您可以对与大多数 POSIX shell 兼容的东西使用类似的方法,zsh并且bash

get_alias() {
  eval "set -- $(alias -- "$1")"
  eval 'printf "%s\n" "${'"$#"'#*=}"'
}
Run Code Online (Sandbox Code Playgroud)


Tom*_*ale 3

根据St\xc3\xa9phane Chazelas\' 的回答,我想出了:

\n
function alias_expand {\n  if [[ $ZSH_VERSION ]]; then\n    # shellcheck disable=2154  # aliases referenced but not assigned\n    [ ${aliases[$1]+x} ] && printf \'%s\\n\' "${aliases[$1]}" && return\n  else  # bash\n    [ "${BASH_ALIASES[$1]+x}" ] && printf \'%s\\n\' "${BASH_ALIASES[$1]}" && return\n  fi\n  false  # Error: alias not defined\n}\n
Run Code Online (Sandbox Code Playgroud)\n

(使用 bash 4.0 或更高版本)。

\n