/bin/sh 无法识别十六进制转义序列

/bin/sh does not recognize hexadecimal escape sequences

为什么会发生在 /bin/bash:

$ printf '%b' '\x90'
?
$

但这发生在 /bin/sh:

$ printf '%b' '\x90'
\x90
$

/bin/bash/bin/sh 有什么区别,为什么第一个解码十六进制而第二个不能?

因为 \xdd 形式的转义序列(其中每个 d 代表一个十六进制数字)是 GNU 扩展,并非随处可用。但是八进制被广泛支持(和standardized),所以你可以使用:

printf '%b' '20'