Bash
列印變數不列印 |/ -
我正在將 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 -C
或hexdump -C /tmp/res.txt
- 我敢打賭你會看到很多十六進製0d
字節(輸入),在每個\
、|
、/
和. 之前或之後都有一個-
。為什麼?沒有換行符的輸入會將游標返回到行首,並且在它之後列印的任何內容都會覆蓋已經存在的內容。
這樣做是在行首實現文本微調器的常用方法(如果在行尾完成,訣竅是不列印 LF 或 CR,並使用 Backspace 字元(
^H
, akaCtrl
-H
, ASCII字元 0x08) 在每個微調器字元之後,通常先有一個小的延遲。注意:在每個輸入符附近還會看到終端控制序列,例如 Erase Line(
<ESC>[2K
或1b 5b 32 4b
vt-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。