[英]proper zsh shell command escapement
我有一个非常强大的技巧,我正在尝试保存我输入的每个命令:
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
所以它不会搞砸!$
et.al.),但它现在主要适合我。
但是,我注意到现在我正在构建一个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专家的一些帮助!!
zsh邮件列表中的此示例使用print
。 将它与您的功能结合使用可以:
zshaddhistory () {
# Print to the default history file with the newline stripped.
print -sr -- "${1%%$'\n'}"
# Ignore common commands.
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
# Switch history contexts
fc -p ~/.zsh_history_detail
# Push the current line into the current history context with newline stripped and user / time appended.
print -sr -- "${1%%$'\n'} ### ${PWD} $(date '+%Y-%m-%d %R')"
return 1
}
这似乎做你想要的。 我已经使用echo "\\\\"
和echo "\\n"
:
charizard% cat ~/.zsh_history_detail
cat: /Users/simont/.zsh_history_detail: No such file or directory
charizard% echo "\\"
\
charizard% cat ~/.zsh_history_detail
: 1376117319:0;echo "\\" ### /Users/simont 2013-08-10 16:18
charizard% cat "\n" # This was an oopsie
cat: \n: No such file or directory
charizard% echo "\n"
charizard% echo "\\"
\
charizard% cat ~/.zsh_history_detail
: 1376117319:0;echo "\\" ### /Users/simont 2013-08-10 16:18
: 1376117334:0;cat "\n" ### /Users/simont 2013-08-10 16:18
: 1376117339:0;echo "\n" ### /Users/simont 2013-08-10 16:18
: 1376117343:0;echo "\\" ### /Users/simont 2013-08-10 16:19
我不知道你的意思是:
但它使它逃脱空格和双引号,所以它也是错误的
所以我无法测试。
我找到了问题的根源,通过阅读zsh手册页部分比我之前做的更加谨慎。
print
:
-r Ignore the escape conventions of echo.
所以,我必须对我的zshrc进行的唯一更改(我的~/.zshrc
zshrc
链接到这个zshrc
文件)是:
diff --git a/zshrc b/zshrc
index 5e72133..af97c35 100644
--- a/zshrc
+++ b/zshrc
@@ -68,7 +68,7 @@ function zshaddhistory() {
# do not do anything on common commands
# do the needful
- echo "$PWD; $COMMAND_STR; $TTY@$HOST@$(date +%s.%N)" >> ~/.zsh_enhanced_history
+ print -r "$PWD; $COMMAND_STR; $TTY@$HOST@$(date +%s.%N)" >> ~/.zsh_enhanced_history
# rest is "default" zshaddhistory()
print -Sr ${COMMAND_STR}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.