我正在对 mint 20 进行代码研究,/lib/lsb/init-functions
只是为了熟悉 SystemV init 系统。
其中有log_action_end_msg
一个函数包含以下代码片段,
TPUT=/usr/bin/tput
if log_use_fancy_output; then
RED=$( $TPUT setaf 1) #=> Step 1
NORMAL=$( $TPUT op) #
/bin/echo -e "${RED}failed${end}${NORMAL}" || true #=> Step 2
else
echo "failed${end}" || true
fi
当变量RED
被赋予值时$( $TPUT setaf 1 )
,我期望 RED 被赋予一个空字符串,因为命令行上的 tput 运行不会打印任何内容。
但是,我看到变量被传递给 echo in,暗示它存储了一些东西。当 tput 不打印任何内容时,如何设置Step 2
变量?RED
(或者)让我们把其他东西放在一边。拿一个新的终端,然后RED=$( $TPUT setaf 1)
在我的终端上运行,我期望终端字体颜色设置为红色,但事实并非如此。只有当我这样做时echo $RED
,它才会变成红色。
为什么 tput 命令没有在替换步骤期间运行,但是在调用时运行echo
。
tput setaf 1
它本身确实会输出一些内容,但你的终端会处理它,并且你不会立即看到任何输出。尝试tput
以8 位值序列形式查看 的输出。在
但是,输出不会到达终端,而是存储在
RED
变量中。请注意,即使为
RED
空,步骤 2 也是有效的:变量可以为空,甚至可以为未定义,除非set -u
有效。在新终端中,只有将 生成的序列
tput
写入其中时,颜色才会改变。如上所述,RED=$($TPUT setaf 1)
不会将任何内容写入终端。用于将颜色更改为红色的转义序列仅在运行 时写入终端echo $RED
。