我有一个简单的命令行:
uptime | awk '{print $(NF - 2)}'
在 bash shell 中,这可以正常工作,但是当我在 zsh 中运行它时,出现以下错误:
title:5: command not found: NF
像往常一样,这将是一个试点错误(我不明白扩展在 zsh 中是如何工作的),但我不知道该怎么做才能让相同的命令在 zsh 中工作。
[编辑]
OSX 上的 zsh 版本为 4.3.11,输出为set -xv; uptime | awk '{print $(NF - 2)}'
:
$ set -xv; uptime | awk '{print $(NF - 2)}'
title:5: command not found: NF
+zsh:3> uptime
+zsh:3> awk '{print $(NF - 2)}'
0.51
+precmd:1> title '%15<..<%~%<<' '%n@%m: %~'
+title:1> [ '' '!=' true ']'
+title:2> [[ xterm-256color == screen* ]]
+title:4> [[ xterm-256color == xterm* ]]
+title:5> print -Pn '\e]2;%n@%m:\ %~\a'
+title:6> print -Pn '\e]1;%15\<..\<%~%\<\<\a'
+zsh:4> git_prompt_info
+git_prompt_info:1> ref=+git_prompt_info:1> ref=''
+git_prompt_info:1> return
+zsh:4> vi_mode_prompt_info
+vi_mode_prompt_info:1> echo ''
显然 awk 命令可以工作,但我的终端定制失败了。
答案1
title:5: command not found: NF
此错误消息显示名为 的函数中的错误title
,该函数的名称可能会将您的终端标题设置为正在运行的命令。随后的文字记录显示title
被调用precmd
,当命令执行完毕、显示下一个提示之前调用它。但该错误实际上是由preexec
,在运行命令之前调用。该函数在您的~/.zshrc
(或者可能是/etc/zshrc
,或者在它们中的任何一个调用的文件中)定义。
如果没有看到代码,我无法准确判断出了什么问题,但看起来命令字符串正在以某种方式扩展。也许您已prompt_subst
设置选项并通过 打印命令print -P
?您需要逃避该命令。特别是,不要通过 打印它print -P
,打印它print -r
并注意文字控制字符。就像是:
print -r ${${${${(qqqq)1}#\$\'}%\'}//\\\'/'}