我正在将 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 -C
或hexdump -C /tmp/res.txt
- 我敢打赌您会看到很多十六进制0d
字节(回车符),每个 \
、|
、/
和之前或之后都有一个-
。
为什么?不带换行符的回车符会将光标返回到行的开头,并且在其之后打印的任何内容都会覆盖已经存在的内容。
这是在行首实现文本旋转器的常用方法(如果在行末实现,技巧是不是打印 LF 或 CR,并在每个微调器字符后使用退格字符(^H
又名Ctrl- ,ASCII 字符 0x08),通常先有一个小的延迟。H
注意:在每个回车符附近还经常会看到终端控制序列,例如擦除行(<ESC>[2K
或1b 5b 32 4b
vt-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 )"