ワイルドカードの拡張方法をシェル履歴に記録できますか?

ワイルドカードの拡張方法をシェル履歴に記録できますか?

私が実行した場合:

$ ls *
foo bar buzz
$ history | tail -1
ls *

私のシェルの記録ls *からls foo bar buzz。 「fooファイルで一体何が起こったのでしょうか?」と疑問に思うとき、レコードをrm *検索して「foo」を見つけて、私が間違ったディレクトリで何をしていたかを見つけることができれば良いでしょう。

zshとbashソリューションに興味があります。

答え1

私は、どのシェルもコマンドを履歴に保存するときに空白の変更以外の操作を実行しないと思います。拡張機能の内容は*文書化されておらず、記録するオプションもないようです。

いずれにせよ、完全な普遍性を文書化することは不可能であることに注意してください。たとえば、a='foo* bar*'; rm $a(zshで)を実行すると、rm $=~aシェルが構文的にワイルドカード一致を検出する可能性はほとんどありません。そして、すべてのグローバル拡張を文書化するオプションはありません。

あなたは何かを一つにまとめることができますpreexec(またはバッシュに相当する)。初めてテストされていない場合(zshの場合):

history_wildcards=()
precmd () {
  emulate -LR zsh
  local n tmp
  history -1 | read n tmp
  history_wildcards[$(($n+1))]=$=~1
}

これにより、history_wildcardsコマンドラインの各単語のグローバル拡張を含む文字列で配列が埋められます。トークン化は簡単な方法で行われるため、同様の方法がecho ' /**/* '拡張されます/**/*(つまり、ディスクをナビゲートします)。それから有用なものや信じcd subdir && echo *られないほど些細なことを得ることを期待しないでください。

事前に計画している場合は、コマンドを送信する前にzsh拡張ワイルドカードを使用できます。デフォルト設定では、Tabカーソルが球の上にある間に押すだけです。別の方法で設定した場合は^X *expand-word)を試してください。

関連情報