dtk*_*dtk 7 prompt zsh function command-substitution newlines
我正在自定义我的 zshPROMPT
并调用一个函数,该函数可能是也可能不是echo
基于环境变量状态的字符串:
function my_info {
[[ -n "$ENV_VAR"]] && echo "Some useful information\n"
}
local my_info='$(my_info)'
PROMPT="${my_info}My awesome prompt $>"
Run Code Online (Sandbox Code Playgroud)
我希望信息以尾随换行符结尾,这样如果设置了它,它就会出现在自己的行上:
Some useful information
My awesome prompt $>
Run Code Online (Sandbox Code Playgroud)
但是,如果未设置,我希望提示在一行上,避免提示中由无条件换行引起的空行:
PROMPT="${my_info} # <= Don't want that :)
My awesome prompt $>"
Run Code Online (Sandbox Code Playgroud)
目前,我$(command substitution)
通过使用非打印字符作为后缀来解决删除换行符的问题,因此换行符不再尾随:
[[ -n "$ENV_VAR"]] && echo "Some useful information\n\r"
Run Code Online (Sandbox Code Playgroud)
这显然是一个黑客。有没有一种干净的方法来返回以换行符结尾的字符串?
编辑:我明白是什么导致了尾随换行符丢失以及为什么会发生这种情况,但在这个问题中,我特别想知道如何防止这种行为(我认为这种解决方法不适用于我的情况,因为我是寻找“条件”换行符)。
编辑:我更正了:引用的解决方法实际上可能是一个相当不错的解决方案(因为比较中的前缀字符串是一种常见且有些相似的模式),但我无法使其正常工作:
echo "Some useful information\n"x
[...]
PROMPT="${my_info%x}My awesome prompt $>"
Run Code Online (Sandbox Code Playgroud)
不会x
为我剥离尾随。
编辑:针对提示扩展的怪异调整建议的解决方法,这对我有用:
function my_info {
[[ -n "$ENV_VAR"]] && echo "Some useful information\n"x
}
local my_info='${$(my_info)%x}'
PROMPT="$my_info My awesome prompt $>"
Run Code Online (Sandbox Code Playgroud)
如果这是比原始解决方案更好的解决方案,则由您来判断。我认为它更明确一点,但也感觉不那么可读。
最后的换行符从命令替换中删除。即使 zsh 也没有提供避免这种情况的选项。因此,如果您想保留最终换行符,则需要将它们安排为不是最终换行符。
\n\n最简单的方法是在您想要准确获取的数据后面打印一个额外的字符(换行符除外),并从命令替换的结果中删除最后一个额外的字符。您可以选择在该额外字符后添加换行符,无论如何它都会被删除。
\n\n在 zsh 中,您可以将命令替换与字符串操作结合起来以删除多余的字符。
\n\nmy_info=\'${$(my_info; echo .)%.}\'\nPROMPT="${my_info}My awesome prompt $>"\n
Run Code Online (Sandbox Code Playgroud)\n\n在您的场景中,请注意这my_info
不是命令的输出,它是获取输出的 shell 片段,当提示符展开时将对其进行评估。PROMPT=${my_info%x}\xe2\x80\xa6
不起作用,因为它试图x
从变量的值中删除最终值my_info
,但它以)
.
在其他 shell 中,这需要分两步完成:
\n\noutput=$(my_info; echo .)\noutput=${output%.}\n
Run Code Online (Sandbox Code Playgroud)\n\n在 bash 中,您无法my_info
直接从PS1
;调用 相反,您需要从 调用它PROMPT_COMMAND
。
PROMPT_COMMAND=\'my_info=$(my_info; echo .)\'\nPS1=\'${my_info%.}\xe2\x80\xa6\'\n
Run Code Online (Sandbox Code Playgroud)\n