印刷変数は印刷されません。 \|

印刷変数は印刷されません。 \|

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.txt16進0dバイト(キャリッジリターン)が表示されます。\|/-

なぜ?改行文字のないキャリッジリターンはカーソルを行の先頭に戻し、その後に印刷された内容はすでに存在する内容を上書きします。

これは、行の先頭にテキストローターを実装する一般的な方法です(行の最後に実装する場合、トリックは次のようになります)。いいえLFまたはCRを印刷し、各スピナー文字の後にバックスペース文字(^H別名-、ASCII文字0x08)を使用しますCtrl。通常、最初に少しの遅延が発生します。H

<ESC>[2K注:行クリア(または1b 5b 32 4bvt-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 )"

関連情報