A variável de impressão não imprime \ | / -

0

Estou capturando a saída do script de inicialização do Kafka na variável e, ao iniciar, imprime o Kafka \ | / - para simular a linha de fiação. Então, quando eu faço:

res='./confluent start kafka'
echo $res

O resultado é:

kafka is [UP][UP] Starting kafka

Mas quando eu faço:

echo $res > /tmp/res.txt

E abra este arquivo no Windows eu recebo:

Starting zookeeper 
\
|
/
-
\
|
/
-
\
|
/
-
\
|
/
-
\
|
/
-
\zookeeper is [[0;32mUP[0m] Starting kafka 
|
/
-
\
|
/
-
\
|
/
-
\
|
/
-
\
|
/
-
\
|
/
-
\
|
/
-
\
|
/
-
\
|
/
-kafka is [[0;32mUP[0m]

Quando abro este arquivo no Linux, recebo o resultado sam como com echo :

kafka is [UP][UP] Starting kafka

Por que esses caracteres são visíveis apenas no Windows?

    
por ctomek 09.03.2018 / 15:00

2 respostas

4

Teste echo "$res" | hexdump -C ou hexdump -C /tmp/res.txt - Aposto que você vê muitos 0d bytes (retornos de carro), um antes ou depois de cada \ , | , / e - .

Por quê? Um retorno de carro sem alimentação de linha devolve o cursor ao início da linha e qualquer coisa é impressa depois que ele sobrescrever o que já estava lá.

Fazer isso é uma maneira comum de implementar um controle giratório de texto no início de uma linha (se feito no final de uma linha, o truque é NÃO imprimir um LF ou CR, e use um caractere Backspace ( ^H , também conhecido como Ctrl - H , caractere ASCII 0x08) após cada caractere rotativo, geralmente com um pequeno atraso primeiro.

Nota: não é incomum ver também seqüências de controle de terminal como Erase Line ( <ESC>[2K ou hex 1b 5b 32 4b em um terminal compatível com vt-100) ou Erase To End Of Line ( ESC[K ou hex 1b 5b 4b ) perto de cada retorno de carro. Isso é improvável nesse caso, porque eles provavelmente apareceriam de alguma forma defeituosa no editor do Windows.

Em outras palavras, os caracteres são na saída, eles são sobrescritos rápido demais para você ver. Seu editor do Windows provavelmente está convertendo os CRs para CR-LF.

BTW, o unix usa LF apenas para finalizar uma linha de texto. O Windows usa o CR-LF. Antigos, pré-unix, os Macs costumavam usar apenas CR.

    
por 09.03.2018 / 15:20
1

Se você estiver usando o cat, o Linux reproduzirá os caracteres de controle do cursor que fazem o terminal sobrescrever as saídas intermediárias. Tente cat -tv res.txt .

Além disso, é uma boa forma de citar duas vezes suas capturas e usar $ () em vez de '' (assumindo bash, ash ou shell moderno similar) para evitar gerar um novo processo de shell, como em res="$( ./confluent start kafka )"

    
por 09.03.2018 / 15:10