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
みてください。各後に1つずつ、hexdump -C /tmp/res.txt
16進0d
バイト(キャリッジリターン)が表示されます。\
|
/
-
なぜ?改行文字のないキャリッジリターンはカーソルを行の先頭に戻し、その後に印刷された内容はすでに存在する内容を上書きします。
これは、行の先頭にテキストローターを実装する一般的な方法です(行の最後に実装する場合、トリックは次のようになります)。いいえLFまたはCRを印刷し、各スピナー文字の後にバックスペース文字(^H
別名-、ASCII文字0x08)を使用しますCtrl。通常、最初に少しの遅延が発生します。H
<ESC>[2K
注:行クリア(または1b 5b 32 4b
vt-100準拠の端末ではHex)や行末で消去(ESC[K
またはHex)など、各キャリッジリターンの近くで端末制御シーケンスを表示することも一般的です。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、または同様の最新のシェルの仮定)の代わりに$()を使用して、次の新しいシェルプロセスが生成されるのを防ぐことをお勧めします。res="$( ./confluent start kafka )"