エイリアス拡張のインポート(bashとzshから)

エイリアス拡張のインポート(bashとzshから)

エイリアスの拡張子を取得したい。

たとえば、次のような場合があります。

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

私は以下が欲しい:

expand_alias g==hub

expand_alias cdh==cd $HOME

難しいのは、両方のシェルの出力が互いに異なることです。 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")"
)

aliasaliasデフォルトでは、最初の引数の最初の右側の内容を印刷する関数でオーバーライドした後、出力を評価します。=

ほとんどのPOSIXシェルと互換性があるように、同様のアプローチを使用できますzshbash

get_alias() {
  eval "set -- $(alias -- "$1")"
  eval 'printf "%s\n" "${'"$#"'#*=}"'
}

答え2

に基づいてStefan Chazerasの答え、私は次のことを思い出しました。

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

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

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

答え4

私のzsh環境では、コマンドを入力しないと、すべてのエイリアスのリストaliasが表示されます。stdoutBash(MacOS)でも同じことが起こります。これらはすべて形ですalias=expansion

したがって、sedを使用してさらにフィルタリングできます。alias | sed -ne 's/cdh=\(.*\)$/\1/p'「cdh」が知りたいエイリアスの場合。これが一般的なタスクの場合は、構成ファイルにそれに対するシェル関数を作成できます。

expand_alias() { alias $@ | sed -ne 's/^'$@'=\(.*\)$/\1/p' }

関連情報