xargsがUnicodeリテラルを処理する方法を理解できません。

xargsがUnicodeリテラルを処理する方法を理解できません。

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最初の例では値は通常の文字列として扱われますが、2番目の例では正しくエンコードされています。私もそれを使用するときと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シェル

関連情報