zsh fcコマンドでワイルドカードを使用する

zsh fcコマンドでワイルドカードを使用する

zshrc にエイリアスが設定されており、sudo を使用してコマンドを再実行できます。

alias please='sudo $(fc -nl -1)'

「同様に、前のコマンドでワイルドカードを使用した場合を除いて、これはうまく機能します。rm*.o"、コマンドは"rm: '*.o' を削除できません: そのファイルまたはディレクトリがありません」。

このエイリアスがワイルドカードを正しく使用するための良い方法はありますか?

答え1

いいえ、「正しいワイルドカードを使用するようにこのエイリアスを取得する」良い方法はありません。なぜなら、「正しい」は状況によって異なることを意味するからです。たとえば、コマンドラインにコマンド置換が含まれている場合は、rootとして追加のコマンドを実行する予定ですか?あなたが追求する自動化は、間違ったことをすばやく実行するのに非常に便利です。車を見るのはとても迷惑なので、道を渡るときに目を閉じるのと同じです。

私のアドバイスは、コマンドを入力しUp Home s u d o Spaceてしばらく時間をかけて再度読み、目的の操作が行われていることを確認することです。

つまり、冒険心が強ければ、コンピュータにその仕事をさせることもできます。。これは異なるタスクを実行する2つのソリューションです。

次の関数は、前のコマンドが外部コマンドの呼び出しであると仮定します。同じパラメータを使用してsudoプレフィックスを持つ外部コマンドを呼び出します。つまり、ワイルドカード拡張、変数置換、コマンド置換などがすべてシェルコンテキストで呼び出されます。

please () {
  setopt local_options err_exit
  local args
  eval "args=($history[$((HISTCMD-1))])"
  print -lr Running sudo "$args[@]"
  sleep 2
  sudo "$args[@]"
}

次のコマンドは、前のコマンドがシェル環境を変更せず、環境変数に依存しないと仮定します。ワイルドカード拡張、コマンド置換など、コマンドライン全体をrootとして実行します。

please () {
  sudo zsh -c "$history[$HISTCMD]"
}

答え2

唯一の解決策は次のとおりです。

alias please='eval sudo $(fc -nl -1)'

答え3

出力を無効にするZshワイルドカードコマンドの置き換え設定されていない場合GLOB_SUBST

このオプションを設定すると、GLOB_SUBST引用符のないコマンドの置き換え(上記の特殊形式を含む)の結果としてファイル名が生成されることがあります。

これを有効にすると、エイリアスが機能します。また、使用することができますhistoryソート:

history
この連想配列は、過去のイベント番号を完全な歴史行にマップします。連想配列として提示されますが、すべての${history[@]}値の配列()は、最新の歴史的出来事から順番に(つまり、歴史的事象の数を減らして)返されることを保証します。

その後、使用パターン交換フラグオプションで有効化GLOB_SUBST:

${=spec}
仕様評価中に単語分割の規則を使用してくださいSH_WORD_SPLIT。ただし、引数が2=倍になっている場合は、引数が二重引用符で表示されているかどうかにかかわらずオフにしてください。これにより、IFSを区切り文字として使用して、置換の前にパラメータ拡張が別の単語に分割されます。 [...]

${~spec}
GLOB_SUBST仕様評価オプションをオンにします。~ 倍増したらオフにしてください。

例:

% alias s='sudo ${~=${history[@]}[1]}'
% echo *                                   
a b c
% s
[sudo] password for muru: 
a b c
% echo [a]
a
% s       
a

関連情報