打印变量不打印 \ | /-

打印变量不打印 \ | /-

我正在将 Kafka 启动脚本输出捕获到变量中,并在启动 Kafka 时打印 \ | / - 模拟纺纱生产线。所以当我这样做时:

res=`./confluent start kafka`
echo $res

结果是:

kafka is [UP][UP] Starting kafka

但是当我这样做时:

echo $res > /tmp/res.txt

在 Windows 上打开这个文件我得到:

Starting zookeeper 
\
|
/
-
\
|
/
-
\
|
/
-
\
|
/
-
\
|
/
-
\zookeeper is [[0;32mUP[0m] Starting kafka 
|
/
-
\
|
/
-
\
|
/
-
\
|
/
-
\
|
/
-
\
|
/
-
\
|
/
-
\
|
/
-
\
|
/
-kafka is [[0;32mUP[0m]

当我在 Linux 上打开这个文件时,我得到与以下相同的结果echo

kafka is [UP][UP] Starting kafka

为什么这些字符只在 Windows 上可见?

答案1

尝试echo "$res" | hexdump -Chexdump -C /tmp/res.txt- 我敢打赌您会看到很多十六进制0d字节(回车符),每个 \|/和之前或之后都有一个-

为什么?不带换行符的回车符会将光标返回到行的开头,并且在其之后打印的任何内容都会覆盖已经存在的内容。

这是在行首实现文本旋转器的常用方法(如果在行末实现,技巧是不是打印 LF 或 CR,并在每个微调器字符后使用退格字符(^H又名Ctrl- ,ASCII 字符 0x08),通常先有一个小的延迟。H

注意:在每个回车符附近还经常会看到终端控制序列,例如擦除行(<ESC>[2K1b 5b 32 4bvt-100 兼容终端上的十六进制)或擦除到行尾(ESC[K或十六进制)。1b 5b 4b在这种情况下,这种情况不太可能发生,因为它们可能会以某种损坏的形式出现在 Windows 编辑器中。

换句话说,人物在输出中,它们只是被覆盖得太快而你看不到。您的 Windows 编辑器可能“有帮助”地将 CR 转换为 CR-LF。

顺便说一句,unix 仅使用 LF 来结束一行文本。 Windows 使用 CR-LF。 UNIX 之前的旧 Mac 过去只使用 CR。

答案2

如果您使用 cat,Linux 会回放光标控制字符,使终端覆盖中间输出。尝试cat -tv res.txt

另外,双引号捕获的内容是一种很好的形式,并使用 $() 而不是 `` (假设 bash、ash 或类似的现代 shell)以避免生成新的 shell 进程,如res="$( ./confluent start kafka )"

相关内容