嗨,我知道您设置了提示变量以编辑提示,如下所示
export PROMPT="This is the date %d"
Run Code Online (Sandbox Code Playgroud)
如何在提示符加载后每次执行命令并打印结果。
实际上有两种(主要)方法可以实现此目的:
使用命令替换在提示符下运行命令
setopt promptsubst
PROMPT='Date %d Result $(a_command) '
Run Code Online (Sandbox Code Playgroud)
promptsubst必须启用,否则zsh将不会执行任何参数扩展,算术扩展或命令替换。另外,提示文本需要以在设置时不进行扩展的方式被引用PROMPT。因此,可以将其放在单引号中,或者,如果您有/想要使用双引号,请在必要时在前面$加上a \来分别引用它们:
PROMPT="Date %d Result \$(a_command) Const $(another_command)"
Run Code Online (Sandbox Code Playgroud)
$(another_command)设置时PROMPT($(a_command)每次仅运行一次,其结果将被永久替换),并且每次显示提示时,它都会扩展。
利用precmd函数(或钩子)和psvar数组:
autoload -Uz add-zsh-hook
a_function () {
psvar[1]=$(a_command)
}
two_function () {
psvar[2]=$(two_command)
}
add-zsh-hook precmd a_function
add-zsh-hook precmd two_function
PROMPT='Date %d Result1 %v Result2 %2v '
Run Code Online (Sandbox Code Playgroud)
precmd在打印提示之前运行该功能。您还可以设置要在precmd_functions数组中运行的函数的列表。 add-zsh-hook 提供了一种向该数组添加函数的简便方法。%Nv提示中的替换为psvar数组的第N个元素。假设N为if (%v)N==1(其他采用数字参数的提示令牌也是如此)乍一看,第二种方法看起来比仅使用复杂得多promptsubst。但这只是非常简单的替换的情况。使用precmd允许使用更复杂的函数,而不会PROMPT由于在$( )。
您还可以将两种方法结合起来,并psvar在某些或所有情况下放弃使用:
autoload -Uz add-zsh-hook
setopt promptsubst
a_function () {
a_parameter=$(a_command)
}
two_function () {
psvar[2]=$(two_command)
}
add-zsh-hook precmd a_function
add-zsh-hook precmd two_function
PROMPT='Date %d Result ${a_parameter} %2v'
Run Code Online (Sandbox Code Playgroud)