我想访问 zsh 历史记录,其中的条目由分隔\0
而不是\n
. 内置解析器可以清楚地处理多行条目,因为fc 123
会打开一个保留换行符的编辑器。但是,fc -l 123
(打印到标准输出而不是启动编辑器)将换行符转换为\\n
. 这意味着历史中包含文字的任何命令\n
都不能与换行符消除歧义(例如,printf "\n"
在 awk 调用中)。
有没有办法在 zsh 中使用fc
或内置函数来获取未更改的历史条目?history
我试图避免编写历史文件解析器的工作。作为参考,fish 有history -z
这个用例。
(奖励:我也想做同样的事情来分析 bash 历史。它fc
的行为似乎与 zsh 不同。)
使用
history
变量和参数扩展(可能包括(关联)数组索引)功能。例如,原始等价物
fc -l 123 123
is$history[123]
。要获取数组中的一系列历史元素,您可以使用${(v)history[(I)<123-456>]}
. 要获取字符串中以空值分隔的历史元素列表,您可以使用${(vpj[\0])history[(I)<123-456>]}
. (但请注意,历史元素可以包含空字节,并且您不能将空字节传递给外部命令,因此这并不是特别有用。)要打印那些以 NUL 分隔的,您还可以使用
print -N
, 结合-r
禁用反斜杠扩展,-C1
因此如果没有匹配项,它不会打印任何内容:或者:
以整个历史为例。
使用
bash
,如果我们假设您不输入第二行和以下行以空格、数字和至少 2 个空格开头的命令,您可以执行以下操作:要转换历史输出(删除时间戳),如:
至: