![xargs가 유니코드 리터럴을 처리하는 방법을 이해할 수 없습니다.](https://linux55.com/image/182444/xargs%EA%B0%80%20%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C%20%EB%A6%AC%ED%84%B0%EB%9F%B4%EC%9D%84%20%EC%B2%98%EB%A6%AC%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%84%20%EC%9D%B4%ED%95%B4%ED%95%A0%20%EC%88%98%20%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
유니코드 텍스트를 읽을 수 있는 형식으로 변환하려고 합니다. -t 플래그를 사용하여 실행하기 전에 xargs가 어떤 명령을 실행할지 확인합니다. 나는 다음과 같은 이상한 점을 발견했습니다.
$ echo -n "\\\t\\\u0042\\\u0065\\\u006e" | xargs -t -I '{}' echo -e '"'{}'"'
echo -e "\t\u0042\u0065\u006e"
" \u0042\u0065\u006e"
그러나 수동으로 실행하면 다음과 같습니다.
$ echo -e "\t\u0042\u0065\u006e"
Ben
$
\t
이는 두 예제 모두에서 올바르게 처리됩니다. 그러나 \u00XX
첫 번째 예에서는 값이 일반 문자열로 처리되지만 두 번째 예에서는 올바르게 인코딩됩니다. 나는 또한 그것을 사용할 때 printf
똑같은 이상한 행동을 봅니다 .
$echo -n "\\\t\\\u0042\\\u0065\\\u006e" | xargs -t -I '{}' printf \"{}\"
printf "\t\u0042\u0065\u006e"
" printf: invalid universal character name \u0042
$ printf "\t\u0042\u0065\u006e"
Ben
무슨 일이 일어나고 있고 어떻게 해결하는지에 대한 아이디어가 있나요?
답변1
Dave의 말이 맞습니다. 관련된 쉘이 없으므로 에코는 /bin/echo입니다. 다음을 시도하십시오.
echo "\\\t\\\u0042\\\u0065\\\u006e" | od -c
echo "\\\t\\\u0042\\\u0065\\\u006e" | xargs -t -I '{}' echo -e '"'{}'"'
# echo -e '"'\t\u0042\u0065\u006e'"'
/bin/echo -e '"'\\t\\u0042\\u0065\\u006e'"'
결과:
0000000 \ \ t \ \ u 0 0 4 2 \ \ u 0 0 6
0000020 5 \ \ u 0 0 6 e \n
0000031
" \u0042\u0065\u006e"
" \u0042\u0065\u006e"
echo -e "\t\u0042\u0065\u006e"
시험을 마친온라인 bash 쉘