Xargs

無法理解 xargs 如何處理 unicode 文字

  • October 28, 2020

我正在嘗試將 unicode 文字轉換為可讀格式。我正在使用 -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

關於正在發生的事情以及如何解決它的任何想法?

Dave 是對的,不涉及 shell,所以 echo 是 /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 shell

引用自:https://unix.stackexchange.com/questions/616717