for ((i=000;i<040;i++));do ...
从 0 到 39,有 40 个值!?... 打印从 A
到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
我的完整答案
由于此问题已关闭,因此无法添加任何答案,因此我的解释是:
误解是由(ab)使用2>/dev/null
!!
所以,简单地放弃它就可以了:
for ((i=0070;i<0155;i++));do
echo -e $(eval "printf "\\\\%04o" $((19+0$i)) ");
done |
xargs
bash: 19+058: value too great for base (error token is "058")
bash: 19+059: value too great for base (error token is "059")
...
bash: 19+098: value too great for base (error token is "098")
bash: 19+099: value too great for base (error token is "099")
bash: 19+0108: value too great for base (error token is "0108")
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=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
好的,它是octal,所以不是 85 个值,而是 53 个:
echo $(( 155 - 70 )) $(( 0155 - 0070 )) $(( 109 - 56 ))
85 53 53
这会产生 53 个值和 27 个错误:
echo $((53-27))
26
是的!
这是正确的字母数量(在我的字母表中)!
结论
问题可以改写为:
滥用
/dev/null
如何产生奇怪的行为
所以在重定向 STDERR 时要小心,更喜欢使用如下命令:
command 2> >(grep -v "unwanted message" >&2)