zsh:エイリアス拡張なしで残りの行を実行するプレフィックス関数

zsh:エイリアス拡張なしで残りの行を実行するプレフィックス関数

私は考えています:

function noalias() { 
  setopt localoptions noexpandalias
  "$@"
 }

しかし、最後の行が何であるかわかりません。eval "${*:q}"eval "$@"eval "${@:q}""${@:q}"${@:q}$@? (その違いを説明してもらえますか?)

答え1

エイリアスは機能実行だけでなく、単純なコマンドを理解する前の非常に初期の段階で拡張されるため、機能しません。

コマンドラインを読み取って解析するには、まずオプションnoaliasesexpandaliasはいオプション)を適用する必要がありますbash

ただし、通常の別名、つまり定義を使用してコマンドの場所で拡張された別名のみを無効にするには、alias foo=bar次のようにします。

noalias() "$@"

十分です。なぜなら、aliasがあればcmd次から拡張されないからです。

noalias cmd args

なぜならcmd彼は指揮権を持っている位置にいないからだ。

動作しませんグローバルalias -gエイリアス(たとえば、alias -g args=fooシェルを拡張するように設定されたエイリアス)言葉コマンドの位置にあるかどうかにかかわらず)。

そうしても:

noalias() { 
  setopt localoptions noaliases
  eval "$@"
}

以下を使用してコマンドを呼び出します。

noalias 'cmd args'

たとえば、次のようになります。

alias -g "'cmd arg'=gotcha"

または

alias -g noalias=gotcha

あなたは走らなければなりません

set +o expandalias

コマンドを読む前に。ただし、これを行うにはキーバインディングを使用できます。

toggle-aliases() {
  if [[ -o aliases ]]; then
    set +o aliases
  else
    set -o aliases
  fi
  zle -I
}
zle -N toggle-aliases
bindkey '\eA' toggle-aliases
PS1='[aliases $options[aliases]] '$PS1

Alt次に+ Shift+を押してA切り替えます。

関連情報