특정 문자열 매달기 [,[[

특정 문자열 매달기 [,[[

하지만퍼즈 테스트나는 이것이 가능하다는 것을 다음과 같이 정의함으로써 발견했습니다.

var=$'\365\\'

, 다음 두 명령을 실행합니다(마지막 개행 문자 앞의 모든 항목을 제거하려면).CPU를 100% 사용하여 무기한 중단됨Bash 4.2.25(1)-릴리스(x86_64-pc-linux-gnu):

[ -n "${var##*$'\n'}" ]
[[ -n "${var##*$'\n'}" ]]

런어웨이 프로세스는 ( -또는 ) 또는 를 bash사용하여 중단할 수 없지만 종료하려면 를 사용해야 합니다 .SIGINTCtrlCkill -SIGINT $pidSIGTERMSIGKILL

나는 다음을 사용하여 값을 확인하려고 시도했습니다.

uniname -bcp <<<"$var"

그러나 이것도 공중에 떠 있습니다. uniname그러나 죽일 수는 있습니다 SIGINT.

또한 몇 가지 다른 기본 명령도 확인했는데 모두 잘 작동합니다.

echo "$var"
printf '%q\n' "$var"
touch -- "$var"
rm -- "$var"

여기서 무슨 일이 일어나고 있는 걸까요? 이것이 다른 사람들에 의해 복제될 수 있습니까? 이것이 정의된 동작인가요?

답변1

bash-4.2이는 잘못된 UTF-8 문자가 포함된 문자열의 글로빙과 관련된 UTF-8 로케일의 패치 29에 있는 버그입니다 \365\\.

다음 명령을 사용하여 재현할 수도 있습니다.

: *$'\365x'

이 문제는 다음에서 수정되었습니다.패치 30, 패치 노트 및메일링 리스트 토론더 알아보기.

관련 정보