我有一个非常强大的技巧,我正在尝试用它来保存我曾经输入的每个命令:
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"
的输出保存为$COMMAND_STR
,这似乎确实解决了换行符问题,甚至可能是反斜杠,但它会转义空格和双引号,所以也是错误的。常规的~/.zsh_history
文件没有这个问题,它包含了完全按照输入的命令。因此,在我的zshaddhistory
中,我没有做出正确的转换。也许有额外的shell字符串评估需要防止。需要一些来自zsh专家的帮助!
print -S
吗?print
的zsh 内置命令
建议使用-s
。 - simont!$
和其他相关内容。这非常令人沮丧。 - Steven Lu