gpt4 book ai didi

linux - bash PS1 : line wrap issue with non-printing characters from an external command

转载 作者:IT王子 更新时间:2023-10-29 00:10:09 24 4
gpt4 key购买 nike

我正在使用外部命令来填充我的 bash 提示符,它会在每次评估 PS1 时运行。但是,当此命令输出不可打印的字符(如颜色转义码)时,我遇到了问题。这是一个例子:

$ cat green_cheese.sh 
#!/bin/bash
echo -e "\033[32mcheese\033[0m"

$ export PS1="\$(./green_cheese.sh) \$"
cheese $ # <- cheese is green!
cheese $ <now type really long command>

在 PS1 提示中处理非打印字符的规范方法是将它们包含在 \[\] 转义序列中。问题是,如果您从外部命令执行此操作,那么 PS1 解释器不会解析这些转义符:

$ cat green_cheese.sh 
#!/bin/bash
echo -e "\[\033[32m\]cheese\[\033[0m\]"
$ export PS1="\$(./green_cheese.sh) \$"
\[\]cheese\[\] $ # <- FAIL!

我可以从外部命令中使用特定的转义序列来达到预期的结果吗?或者有什么方法可以手动告诉提示将提示宽度设置为多少个字符?

假设我可以从外部命令打印任何我喜欢的东西,并且这个命令可以非常智能(例如,计算输出中的字符数)。我还可以根据需要使 export PS1=... 命令变得复杂。 但是,颜色的转义码必须来自外部命令。

提前致谢!

最佳答案

我无法确切地告诉你为什么这行得通,但是用 的实际字符替换 \[\] bash 在您的提示中从它们生成:

echo -e "\001\033[32m\002cheese\001\033[0m\002"

[我从现在找不到的一些 Stack Overflow 帖子中了解到这一点。]

如果我不得不猜测,那是因为 bash 在执行嵌入的命令之前用两个 ASCII 字符替换了 \[\]在提示中,以便在 green_cheese.sh 完成时,bash 正确处理包装器为时已晚,因此它们按字面意思处理。避免这种情况的一种方法是使用 PROMPT_COMMAND 动态构建提示,而不是将可执行代码嵌入到 PS1 的值中。

prompt_cmd () {
PS1="$(green_cheese.sh)"
PS1+=' \$ '
}

PROMPT_COMMAND=prompt_cmd

这样,\[\]定义 时添加到 PS1,而不是当它被评估时,所以你不需要直接使用\001\002

关于linux - bash PS1 : line wrap issue with non-printing characters from an external command,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24839271/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com