最近,我在终端中玩了很多颜色,因此也使用了转义序列。我已经阅读了 Bash 联机帮助页的相关部分以及网络上的许多有用页面。
我已经完成了大部分我想要的工作;例如,漂亮的彩色 Bash 提示。也就是说,我仍然对何时应该使用(或需要使用)“非打印转义序列”字符感到困惑。那些将是\[
和\]
。
如果我在定义我的提示时没有在 PS1 中使用它们,那么我的提示肯定不会正确显示。如果我确实使用它们,一切都很好。好的。
但是,在 PS1 之外,它们的操作方式似乎不同。例如,为了使脚本更具可读性,我定义了一个$RGB_PURPLE
通过简单函数设置的变量c8_rgb()
。最终结果是变量包含\[\e[01;38;05;129m\]
打开粗体紫色前景色的值。
当我在 PS1 中使用这个变量时,它符合我的预期。如果我通过它使用它printf
或者echo -e
它“一半”有效。命令printf "${RGB_PURPLE}TEST${COLOR_CLR}\n"
(其中COLOR_CLR
是重置文本属性的转义序列)导致以下显示:\[\]TEST\[\]
除了第一个\[
和最后一个以外的所有内容\]
都以紫色显示。
为什么会有差异?为什么这些括号被打印出来而不是被终端处理?我希望它们在作为提示的一部分打印时与通过其他方式打印时得到相同的对待。我不明白这种变化。
根据经验,这些字符似乎必须在提示定义中使用,而它们不应该在几乎所有其他情况下使用。这使得使用通用函数(如我c8_rgb()
上面提到的函数)来处理转义序列生成和输出变得困难,因为该函数无法知道其结果是在提示配置中还是在其他地方。
和快速的相关问题:是echo -e
和printf
基本至于输出转义序列相同?我通常使用 printf,但有什么理由偏爱一个而不是另一个?
谁能解释这种明显的细微差别?在终端中使用转义序列(通常仅用于颜色)时,我还应该注意其他什么奇怪的事情吗?谢谢!
我在这里找到了一些关于“if”语句之间[
和[[
“if”语句之间差异的非常好的答案。对于特定命名的 shell,使用[[
over似乎是个好主意[
(而且速度也更快)。
但是,我仍然不清楚可移植性。如果我的目标是为 POSIX 兼容 shell 编写脚本,我将从脚本开始#!/bin/sh
,那么这种语法是如何允许的。从我读过的内容来看,双括号不在 POSIX 标准中,但在“现实世界”中,这真的有多大问题?
我想我的意思是我想要一个可移植的脚本,但它足以在所有可行的 POSIX shell 上工作,比如 2000-2005。意思是,它不是标准的一部分,是的,但实际上,从 2005 年开始的任何 shell 几乎肯定会接受该语法。
此外,还有一个关于脚本可移植性和 POSIX 的更普遍的问题:其他作者如何处理这个问题?我了解用例和目标受众决定了大部分决策,但是您是否尝试尽可能接近 POSIX 以减少整个 Internet 可能存在的不兼容性,或者您是否利用了大多数 shell 的所有优点?尚未接近 POSIX 标准的支持?
我首先尝试使我的大部分脚本尽可能符合 Bourne 和 POSIX。然而,随着时间的推移,通过阅读更多的 Bash 文档和在网上看到其他人的脚本,我不得不说,利用这些其他功能可以使脚本更容易阅读,并且在许多情况下更小。