私は考えています:
function noalias() {
setopt localoptions noexpandalias
"$@"
}
しかし、最後の行が何であるかわかりません。eval "${*:q}"
?eval "$@"
?eval "${@:q}"
?"${@:q}"
?${@:q}
?$@
? (その違いを説明してもらえますか?)
答え1
エイリアスは機能実行だけでなく、単純なコマンドを理解する前の非常に初期の段階で拡張されるため、機能しません。
コマンドラインを読み取って解析するには、まずオプションnoaliases
(expandalias
はいオプション)を適用する必要があります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切り替えます。