Bash
我可以讓我的 shell 歷史記錄萬用字元是如何擴展的嗎?
如果我執行:
$ ls * foo bar buzz $ history | tail -1 ls *
你可以看到,在我的 shell 歷史中,它記得我是 run
ls *
而不是ls foo bar buzz
. 理想情況下,我想將兩者記錄在不同的歷史中。rm *
當我想知道“文件 foo 到底發生了什麼?”時,如果能夠通過搜尋我的歷史記錄並找到“foo”來返回並找出我在錯誤的目錄中所做的事情,那就太好了。我對 zsh 和 bash 的解決方案感興趣。
我認為在將命令儲存到歷史記錄時,任何 shell 都不會做任何超出空格處理的操作。擴展的內容沒有記錄,
*
似乎也沒有記錄的選項。請注意,無論如何都不可能完整地記錄下來。例如,如果您執行
a='foo* bar*'; rm $a
(rm $=~a
in zsh),shell 不太可能在語法上檢測到萬用字元匹配。並且沒有記錄所有全域擴展的選項。
preexec
你可以用(或等效的 bash )拼湊一些東西。未經測試的先去(對於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
在游標位於 glob 上時按下。如果您以不同方式配置完成,請嘗試^X *
(expand-word
)。