很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便重新打开,访问帮助中心 。
for ((i=000;i<040;i++));do ...
从0到39,有40个值!? ...用于打印A
to Z
???
for ((i=000;i<040;i++));do
echo -e $(eval "printf "\\\\%04o" $((65+0$i)) ");
done 2>/dev/null |
xargs
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
奇怪的!?
有85 值,从 70 到 154:
for ((i=0070;i<0155;i++));do
echo -e $(eval "printf "\\\\%04o" $((19+0$i)) ");
done 2>/dev/null |
xargs
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
想要完整的答案,解释缺失值。
:-p
我的完整答案
由于此问题已关闭,无法添加答案,因此有my 解释:
这种误解是由于(滥用)使用2>/dev/null
!!
因此,只需删除它就会输出:
for ((i=000;i<040;i++));do
echo -e $(eval "printf "\\\\%04o" $((65+0$i)) ")
done | xargs
bash: 65+08: value too great for base (error token is "08")
bash: 65+09: value too great for base (error token is "09")
bash: 65+018: value too great for base (error token is "018")
bash: 65+019: value too great for base (error token is "019")
bash: 65+028: value too great for base (error token is "028")
bash: 65+029: value too great for base (error token is "029")
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
事情变得更加清楚了!
for ((i=000;i<040;i++));do
echo -e $(eval "printf "\\\\%04o" $((65+0$i)) ")
done 2> >(wc -l >&2) | xargs
6
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
有6行错误,因为非法8
or 9
八进制数字。
所以如果这是八进制,那么你可以
printf %d\\n 040
or
echo $(( 040 ))
转换040
八进制到32
十进制。然后32
操作与6
错误,实际上有 26 个输出。
for ((i=0070;i<0155;i++));do
echo -e $(eval "printf "\\\\%04o" $((19+0$i)) ")
done 2> >(wc -l >&2) | xargs
27
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
事实上有 27 个错误,值从... 56 到 108:
printf "%d\n" 0070 0155
56
109
不是 85 个值,而是 53 个:
echo $(( 155 - 70 )) $(( 0155 - 0070 )) $(( 109 - 56 ))
85 53 53
再次强调:53 次操作有 27 个错误 = 26 个输出
echo $((53-27))
26
Yes!
这是正确的字母数(在my 字母)!
结论
该问题可以重写为:
How 滥用/dev/null
可能会做出奇怪的行为
所以重定向时要小心STDERR
!避免简单地重定向STDERR
to /dev/null
:
command 2>/dev/null
并且更喜欢使用以下命令:
command 2> >(grep -v "unwanted message" >&2)