エイリアスが展開されるテキストを取得したい。
たとえば、私が持っている場合:
alias g=hub
alias cdh='cd $HOME'
私が欲しい:
expand_alias g
== hub
expand_alias cdh
== cd $HOME
トリッキーなことは、2つのシェルの出力が異なることです。bash:
$ alias g cdh
alias g='git'
alias cdh='cd $HOME'
zsh:
% alias g cdh
g=hub
cdh='cd $HOME'
alias
プレフィックスとhub
の前後の引用符がないことに注意してください。
StéphaneChazelasの答え に基づいて、私は思いついた:
# Expand an alias as text - https://unix.stackexchange.com/q/463327/143394
function expand_alias {
if [[ -n $ZSH_VERSION ]]; then
# shellcheck disable=2154 # aliases referenced but not assigned
printf '%s\n' "${aliases[$1]}"
else # bash
printf '%s\n' "${BASH_ALIASES[$1]}"
fi
}
(bash 4.0以降を使用)。
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シェル、zsh
およびbash
と互換性のあるものに対して、同様のアプローチを使用できます。
get_alias() {
eval "set -- $(alias -- "$1")"
eval 'printf "%s\n" "${'"$#"'#*=}"'
}
シェル関数を定義するのはどうですか?
EXA() { alias $@ | sed 's/^/expand_/; s/=/ == /; s/\o047//g; '; }