我尝试将历史记录添加内容添加到MacPorts shell。 MacPorts目前使用类似bash的历史记录,其中历史记录是在会话结束后编写的。如果会话崩溃,这可能会有问题,因此我尝试使MacPorts shell遵循zsh的示例。即,在执行文件时将每个历史项附加到文件中。
在GNU readline,中,此功能对于函数append_history
.来说是微不足道的。但是,MacPorts依赖于Apple的editline。 editline库似乎没有append_history
的等价物,所以我有点迷失了为了将历史记录追加到文件中该做什么。我想过使用好的旧标准函数,如fopen
和fprintf
,但我意识到editline使用自己的历史字符串编码(例如,空格字符被转换为八进制\040
)。 MacPorts需要与该编码兼容,因为editline用于多个地方。我假设使用了这种编码,因为空格被用作历史分隔符。
我可以尝试编写自己的函数以兼容此编码,但这似乎充满了不必要的困难。我觉得我必须遗漏一些东西。有没有一种简单的方法可以使用editline将历史记录追加到文件中?
答案 0 :(得分:0)
好吧,解决方案最终还是要使用那些好的旧标准函数。出于偏执狂的考虑,我们还添加了一些文件锁定功能:
s = Tcl_GetString(objv[2]);
hist_file = fopen(s, "a");
flock(fileno(hist_file), LOCK_EX);
fprintf(hist_file, "%s\n", current_history()->line);
flock(fileno(hist_file), LOCK_UN);
fclose(hist_file);
我已经详细说明了here.,文件锁定在the relevant PR.中被建议,这可能不是代码的最终形式,但这是到目前为止的内容,很可能就是一起滚。如果我们更改它,可能会很小。