Bash

列印變數不列印 |/ -

  • March 9, 2018

我正在將 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 上可見?

嘗試echo "$res" | hexdump -Chexdump -C /tmp/res.txt- 我敢打賭你會看到很多十六進製0d字節(輸入),在每個 \|/和. 之前或之後都有一個-

為什麼?沒有換行符的輸入會將游標返回到行首,並且在它之後列印的任何內容都會覆蓋已經存在的內容。

這樣做是在行首實現文本微調器的常用方法(如果在行尾完成,訣竅是列印 LF 或 CR,並使用 Backspace 字元(^H, aka Ctrl- H, ASCII字元 0x08) 在每個微調器字元之後,通常先有一個小的延遲。

注意:在每個輸入符附近還會看到終端控制序列,例如 Erase Line(<ESC>[2K1b 5b 32 4bvt-100 兼容終端上的十六進制)或 Erase To End Of Line(ESC[K或十六進制)。1b 5b 4b在這種情況下這不太可能,因為它們可能會以某種形式出現在 Windows 編輯器中。

換句話說,字元輸出中,只是被覆蓋得太快,你看不到。您的 Windows 編輯器可能“有幫助”將 CR 轉換為 CR-LF。

順便說一句,unix 僅使用 LF 來結束一行文本。Windows 使用 CR-LF。舊的、pre-unix 的 Mac 過去只使用 CR。

引用自:https://unix.stackexchange.com/questions/429247