返回列表 发帖
本帖最后由 CrLf 于 2012-3-22 23:39 编辑
(echo flag1 | echo flag2) > conCOPY
什么情况,这句在我电脑上似乎也出现了内存泄露?win7 系统,求验证及解答
另外,我觉得楼主对重定向符的优先级验证不严谨吧,应该这样证明:
set =|find /c "" 2>nul
(set =|find /c "") 2>nul
set = 2>nul|find /c ""COPY

TOP

回复 4# plp626


    显示是这样的,多显示了两个没见过的字符。话说让我吃惊的是,执行到这里时居然惊动了 360:
   
    而我电脑上的 0x0~0xff 应显示为:
   
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

TOP

本帖最后由 CrLf 于 2012-3-23 16:23 编辑

回复 6# qzwqzw


噢,果然如此,写成这样和 dir 的结果一比较就很明显了:
(echo;|dir)>conCOPY
但是不知为何会因为重定向而导致回车换行符显现真身呢?08、09 确实试出来了,但是不知其所以然
(echo;|set /p= )>con
rem 长串空格为一个 tab 制表符COPY

TOP

话说句柄默认输出就是标准设备,那么可以这样:
(cls 1>&2)>nul
pause
(cls 1>&3)>nul
pauseCOPY
测试中从句柄 4 开始都不能放在 >& 之后,会报这个错误:
重定向句柄 N 时,
无法复制此句柄。COPY

TOP

猜测句柄 4~9 的初始值不是有效句柄
做了一个测试试图证明当初始句柄不是有效句柄时,产生的备份句柄会保留,却得到了奇怪的结果:


A、测试中 3 和 4 为备份句柄:
3=1,4=2
而结束备份后句柄 4 仍无效
echo test >nul 2>nul
echo 无效句柄 1>&4 2>conCOPY
B、
测试中 3、4、5 为备份句柄:
3=1,4=2,5=3
结束备份后句柄 4 变成 3 所备份的状态
echo test >nul 2>nul 3>nul
echo 变成句柄3(nul) 1>&4 2>conCOPY
echo test >nul 2>nul 3>con
echo 变成句柄3(con) 1>&4 2>conCOPY
C、
测试中 3、4、5 为备份句柄:
3=1,4=2,5=3
结束备份后句柄 4 变成 nul
既不是 3 也不是 2,违背测试 C 体现的规律
echo test >nul 2>&1 3>&1
echo 变成 nul 1>&4 2>conCOPY
D、
这两个测试中 3、4、5 为备份句柄:
3=1,4=2,5=3
结束备份后句柄 4 变成 1 的原始状态
echo test >nul 3>nul 4>nul
echo 正确 1>&4 2>conCOPY
E、
这两个测试中 4、5 为备份句柄:
4=3,5=4
结束备份后句柄 4 仍是无效句柄
echo test 3>nul 4>nul
echo 错误 1>&4 2>conCOPY

TOP

有人能看出 16 楼测试结果的隐含规律吗?

TOP

本帖最后由 CrLf 于 2014-11-28 20:26 编辑

发现前面的说法有误,比较以下三个测试:
dir 4>&3COPY
dir >nul 4>&3COPY
dir 1>&3COPY
看来句柄 3~9 的初始状态都是无效句柄
是先发生备份(想过去这也是理所当然的),句柄 3 保存了句柄 1 的值,再执行了 1>&3,把句柄 3 的值借给句柄 1,命令执行完毕后,句柄 3 把备份还给句柄 1,所以看起来句柄 3 仿佛默认等于句柄 1 的初始状态

TOP

回复 20# amwfjhh
(echo,|echo,)>con 1>&3COPY
相同句柄的重定向只以最后一次为准,经过预处理,这里实际执行的重定向只有 1>&3,而句柄 3 是句柄 1 的备份,所以句柄 1 的重定向结果还是原来的句柄 1

TOP

返回列表