Bash

我可以讓我的 shell 歷史記錄萬用字元是如何擴展的嗎?

  • May 7, 2011

如果我執行:

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

你可以看到,在我的 shell 歷史中,它記得我是 runls *而不是ls foo bar buzz. 理想情況下,我想將兩者記錄在不同的歷史中。rm *當我想知道“文件 foo 到底發生了什麼?”時,如果能夠通過搜尋我的歷史記錄並找到“foo”來返回並找出我在錯誤的目錄中所做的事情,那就太好了。

我對 zsh 和 bash 的解決方案感興趣。

我認為在將命令儲存到歷史記錄時,任何 shell 都不會做任何超出空格處理的操作。擴展的內容沒有記錄,*似乎也沒有記錄的選項。

請注意,無論如何都不可能完整地記錄下來。例如,如果您執行a='foo* bar*'; rm $a( rm $=~ain 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)。

引用自:https://unix.stackexchange.com/questions/12311