Shell历史文件的格式是什么?

5

我的~/.zsh_history显示:

: 1449561637:0;echo "foobar"

我猜应该是 unix时间戳:退出码;命令,但是时间戳和冒号之前的空格怎么处理呢?
是否有官方规范?

请注意,Bash 具有不同的格式。它仅仅包含您运行的命令。 - alnet
我认为没有官方的规范。虽然没有记载,但是很容易理解。 - 4ae1e1
1
@alnet,您可以在bash中设置HISTTIMEFORMAT以便为每个条目打上时间戳。 - chepner
没有官方标准,因为每个 shell 都会实现自己的历史记录文件格式。 - chepner
1个回答

7

正如评论中已经指出的那样,历史文件的格式取决于shell,有时甚至取决于shell的特定设置。

在您的情况下,您正在使用启用EXTENDED_HISTORY选项的zsh(通过显式设置或使用csh仿真)。根据ZSH manual,带有EXTENDED_HISTORY的历史记录条目的格式如下:

: <beginning time>:<elapsed seconds>;<command>

所以时间戳前的空格只是格式的一部分,冒号和分号之间的数字实际上是命令执行所需的时间,而不是退出代码。
注意:如果设置了INC_APPEND_HISTORY选项,则始终为0,因为此时历史记录条目会在输入命令后立即写入文件。如果您想记录持续时间并在shell会话之间共享历史记录,可以使用INC_APPEND_HISTORY_TIME。这样做只会在命令完成后将其写入历史记录文件。

如果设置了INC_APPEND_HISTORY_TIME,那么意味着不退出(或崩溃)的命令将不会被写入历史文件吗?我希望有一种方法既能显示每个命令所需的时间,又能保证所有命令都在其中。 - Max Coplan
1
只要命令以任何方式退出且返回给您shell提示符(正常退出、错误码、分段错误等),zsh 就会将该命令追加到历史文件中。只有在 shell 本身也退出(关闭终端窗口、关闭计算机等)时,zsh 才可能无法写入该条目。通过使用 preexec 和/或 precmd 钩子通过编写/编辑历史记录文件可能可以解决此限制。但是,如果它应与多个并行的 zsh 会话一起工作,则这可能需要一些努力。 - Adaephon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接