BASH의 에코 출력 결과 순서가 불안정합니다.

BASH의 에코 출력 결과 순서가 불안정합니다.

경고: 저는 BASH 스크립팅을 처음 접했기 때문에 해킹된 스크립팅에 대한 조언을 주시면 감사하겠습니다.

이상한 문제가 있습니다. 제 코드에서는 한 배열의 파일에서 여러 오류 문자열을 수집하고 두 번째 배열은 오류 수를 동일한 인덱스에 저장합니다(2D 배열이 없기 때문에 이렇게 했습니다. 실제로 매트릭스를 만들고 싶지 않았습니다).

코드를 출력할 때 다음 줄을 사용합니다.

for ((i=0; i<${#NAME_ARRAY[@]}; i++)); do
   echo "Error: ${NAME_ARRAY[$i]} x ${COUNT_ARRAY[$i]}"
done

이 경우 테스트를 위해 두 개의 개별 파일을 사용하고 있으며 파일 1에서 실행하면 다음과 같은 출력이 표시됩니다.

오류: 예외: 알 수 없거나 등록되지 않은 파일 형식: x 72982

이것은 훌륭하고 잘 작동하며 정확히 예상한 대로 작동합니다. 거대한 로그 파일에 단 하나의 오류("예외: 알 수 없음/등록되지 않은 파일 형식:")가 있고 72982번 나타나는 것으로 알고 있습니다.

하지만 다른 경우에는 다음과 같은 결과를 얻었습니다.

x 66964xception: 일종의 디스크 I/O 오류가 발생했습니다.

이것이 내가 완전히 길을 잃은 곳입니다. ${NAME_ARRAY[$i]}만 인쇄하면 "어떤 종류의 디스크 I/O 오류가 발생했습니다."라는 메시지가 표시되는데 이는 전혀 문제가 없습니다. 마찬가지로 ${COUNT_ARRAY[$i]}를 개별적으로 인쇄하면 "66964"가 표시됩니다... 하지만 둘 다 문자열에 넣으면 COUNT_ARRAY 숫자가 문자열 시작 부분에 던져지고 "오류: "를 덮어쓰게 됩니다. 부분.

나는 조금 똑똑하지만 구식일지도 모른다고 생각하여 다음과 같이 하기로 결정했습니다.

echo -n "Error: ${NAME_ARRAY[$i]}"
echo " x ${COUNT_ARRAY[$i]}"

내 아마추어 생각은 이것이 두 개의 출력을 분리할 것이라고 생각했지만(모든 종류의 스레딩/우선순위 문제의 경우) 아쉽게도 여전히 똑같은 결과를 얻습니다.

내가 아주 분명한 것을 놓치고 있는 걸까? 아니면 내 에코가 뭔가 이상한 일을 하고 있는 것 같아요.

방금 echo 대신 printf를 사용하여 테스트했는데 같은 일이 일어났습니다. 콘솔에 인쇄할 때 일종의 문자 인코딩 문제가 있을 수 있습니까?

답변1

"어떤 종류의 디스크 I/O 오류가 발생했습니다." 메시지 \r끝에 문자가 포함될 가능성이 높습니다. 이렇게 하면 커서가 현재 줄의 시작 부분으로 재설정되어 "x 66964"의 다음 출력이 줄의 시작 부분을 덮어쓰게 됩니다. 이 문제를 해결하려면 파이핑 등을 통해 $NAME_ARRAY로 읽을 때 캐리지 리턴을 제거해야 합니다 tr -d '\r'.

관련 정보