인쇄 변수가 인쇄되지 않습니다. \ |

인쇄 변수가 인쇄되지 않습니다. \ |

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보세요 . 각 , 및 뒤에 하나씩 hexdump -C /tmp/res.txt많은 16진수 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로 "유용하게" 변환할 수 있습니다.

그런데 유닉스에서는 텍스트 줄을 끝내기 위해 LF만 사용합니다. Windows에서는 CR-LF를 사용합니다. UNIX 이전 Mac은 CR만 사용했습니다.

답변2

cat을 사용하면 Linux는 커서 제어 문자를 재생하여 터미널이 중간 출력을 덮어쓰게 합니다. 노력하다 cat -tv res.txt.

또한 캡처한 내용을 큰따옴표로 묶고 ``(bash, ash 또는 이와 유사한 최신 쉘 가정) 대신 $()를 사용하여 다음과 같은 새로운 쉘 프로세스가 생성되는 것을 방지하는 것이 좋습니다.res="$( ./confluent start kafka )"

관련 정보