Bash

獲取別名的擴展(在 bash 和 zsh 中)

  • October 19, 2021

我想獲得別名的擴展。

例如,如果我有:

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'

zsh:

% alias g cdh
g=hub
cdh='cd $HOME'

注意 . 周圍沒有alias 前綴和引號hub

根據Stéphane Chazelas 的回答,我想出了:

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 或更高版本)。

zsh,你可以只使用

get_alias() {
 printf '%s\n' $aliases[$1]
}

使用bash(假設它不在 POSIX 模式下,在這種情況下它alias會給出類似於zsh’s 的輸出),你可以這樣做:

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" "${'"$#"'#*=}"'
}

引用自:https://unix.stackexchange.com/questions/463327