Jos*_*vin 8 shell bash command-history zsh wildcards
如果我运行:
$ ls *
foo bar buzz
$ history | tail -1
ls *
Run Code Online (Sandbox Code Playgroud)
您可以看到,在我的 shell 历史记录中,它记住的是我运行的ls *而不是ls foo bar buzz. 理想情况下,我想将两者记录在不同的历史记录中。当我想知道“文件 foo 到底发生了什么事情?”时,如果能够rm *通过搜索历史记录并找到 'foo'来返回并找出我在错误的目录中所做的事情,那就太好了。
我对 zsh 和 bash 的解决方案感兴趣。
我认为在将命令存储到历史记录中时,任何 shell 都不会做任何超出空白调整的事情。*扩展到什么不记录,似乎也没有记录的选项。
请注意,无论如何都无法全面记录。例如,如果您运行a='foo* bar*'; rm $a(rm $=~a在 zsh 中),shell 不太可能在语法上检测到通配符匹配。并且没有选项可以记录所有 glob 扩展。
你可以用preexec(或bash 等价物)拼凑一些东西。未经测试的先去(对于 zsh):
history_wildcards=()
precmd () {
emulate -LR zsh
local n tmp
history -1 | read n tmp
history_wildcards[$(($n+1))]=$=~1
}
Run Code Online (Sandbox Code Playgroud)
这会将history_wildcards数组填充为一个字符串,其中包含命令行中每个单词的 glob 扩展。分词是以简单的方式执行的,因此类似的东西echo ' /**/* '会扩展/**/*(即遍历您的磁盘)。不要指望任何有用的东西cd subdir && echo *或任何如此令人难以置信的非平凡的东西。
如果事先计划好,可以在提交命令之前让 zsh 扩展通配符。在默认配置中,只需Tab在光标位于 glob 上时按下。如果您以不同方式配置完成,请尝试^X *( expand-word)。
| 归档时间: |
|
| 查看次数: |
532 次 |
| 最近记录: |