我正在尝试使用一个非常强大的技巧来保存我输入的每个命令:
function zshaddhistory() {
COMMAND_STR=${1%%$'\n'}
[[ ( -z $COMMAND_STR ) || ( $COMMAND_STR =~ hist(ory)? ) || \
( $COMMAND_STR =~ ^l(s\|l\|a)?$ ) || \
( $COMMAND_STR =~ ^(d\|gd\|git\ diff\|glp\|gg)$ ) \
]] && return 1
# do not do anything on common commands
# do the needful
echo "$PWD; $COMMAND_STR; $TTY@$HOST@$(date +%s.%N)" >> ~/.zsh_enhanced_history
# rest is supposedly "default" zshaddhistory() (except it ain't)
print -Sr ${COMMAND_STR}
fc -p
}
让它正常工作是相当困难的(例如,使用print -S
它不会搞砸!$
等),但它现在主要对我有用。
但是,我注意到现在保存的内容存在一些细微的不一致,因为我正在构建一个 Python 脚本,该脚本将保存的命令漂亮地打印在彩色列中。
为了显示:
% echo "\\"
\
现在~/.zsh_enhanced_history
现在包含:
/home/slu/util; echo "\"; /dev/pts/20@1376064693.136746657
因此,它将echo "\\"
(产生输出\
)保存为echo "\"
(这不是一个格式正确的命令)。
同样,该命令echo "\n"
使用文字换行符保存,因此它将占用历史文件中的两行。事实上,正是这种行为导致我最初找到它,因为我的 python 正则表达式会为一个命令产生与该命令中包含换行符一样多的失败解析。
我尝试更改它,以便保存printf "%q" "$COMMAND_STR"
as的输出$COMMAND_STR
,这似乎确实解决了换行符,甚至可能是反斜杠,但它使它转义了空格和双引号,所以它也是错误的。
常规~/.zsh_history
文件不受此问题的影响,它包含与键入的命令完全相同的命令。
所以在我的某个地方,我zshaddhistory
没有做正确的转换。也许我需要防止发生额外的 shell-string-eval 。
需要 zsh 专家的帮助!!