Bash
獲取別名的擴展(在 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'
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" "${'"$#"'#*=}"' }