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

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

我想获得别名的扩展。

例如,如果我有:

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' }

相关内容