Bash noob在这里,对以下shell函数的行为感到好奇(旨在快速打包ascifiied十六进制序列):
pack()
{
sedF=$(Extended_SED) # choose "-r"/"-E" for BSD/Linux flavors
IN=$(sed 's/%//g' <<< "$1") # allow "%41%41..."
if [ -z $(grep '\\x' <<< "$IN") ] # allow "4142..."
then
IN=$(sed -$sedF 's/(..)/\\\\x\1/g' <<< "$IN")
else # allow "\x41\x42..."
IN=$(sed -$sedF 's/\\/\\\\/g' <<< "$IN")
fi
echo "$IN" | xargs echo -en # pack through -e, suppress CR
# testing
echo "$IN"
echo -en "$IN" # doesn't pack
}
pack "\x41\x41"
和pack "4141"
都会产生以下输出:
AA\\x41\\x41
\x41\x41
但是当我从命令行运行echo -e "\\x41\\x41"
或echo -e "\x41\x41"
时,在脚本之外,我总是得到AA
,这与这些命令在内部运行时的行为有着惊人的不同。脚本。
所以即使它不是脚本的问题,我很好奇 - (a)为什么在脚本中只使用xargs
导致所需的输出{{1 }}? ; (b)为什么脚本中非echo -en
xargs
的行为与脚本之外的行为不同,即从命令行运行时?