【发布时间】:2013-08-09 16:18:29
【问题描述】:
我正在尝试使用一个非常强大的技巧来保存我输入的每个命令:
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-string-eval 。
需要 zsh 专家的帮助!!
【问题讨论】:
-
你确定要
print -S吗?zsh builtinsforprint建议使用-s。 -
是的! 如果您不使用
-S,它将破坏!$和朋友。超级沮丧。
标签: linux macos shell unix zsh