web-dev-qa-db-ja.com

エイリアスの展開を取得します(bashとzshの両方で)

エイリアスが展開されるテキストを取得したい。

たとえば、私が持っている場合:

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の前後の引用符がないことに注意してください。

2
Tom Hale

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以降を使用)。

3
Tom Hale

zshでは、次を使用できます

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

bashを使用すると(POSIXモードではないと仮定すると、そのaliaszshと同様の出力を提供します)、次のことができます。

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

シェル関数を定義するのはどうですか?

EXA() { alias $@ | sed 's/^/expand_/; s/=/ == /; s/\o047//g; '; }
0
RudiC