|
Scott0902
中级用户
积分 466
发帖 237
注册 2005-10-12
状态 离线
|
|
2006-5-11 14:00 |
|
|
chineselgs
高级用户
论坛灌水专业户
积分 613
发帖 266
注册 2006-4-19 来自 河南省
状态 离线
|
『第
17 楼』:
呵呵看了半天,就是不懂!~~
|
饮马恒河畔,剑指天山西,碎叶城揽月,库叶岛赏雪,黑海之滨垂钓,贝尔加湖面张弓;中南半岛访古,东京废墟祭祖!
|
|
2006-5-11 16:18 |
|
|
arding
初级用户
积分 90
发帖 38
注册 2006-1-6
状态 离线
|
『第
18 楼』:
Quote: | Originally posted by chenall at 2006-3-26 14:38:
指定了2次句柄3当然无法同时使用了,把第二个改成echo. 1>nul 4>nul看看
确实可以.
恢复分别用echo 2>con 5>con , echo 1>con 6>con,若是只想栮.. |
|
我们讨论的对象中都出现了两个 > ,用i,j表示0到9的数字,如果将句柄看作指向设备的指针,则默认时:
句柄 指向
stdin [0] con
stdout[1] con
stderr [2] con
当命令cnd i>nul j>nul 中的第一个>被执行时,系统将[ i]的目标暂存于未用的句柄空间,如[3],已备命令结束时恢复。然而,第二个>使得暂存的内容被修改,于是给后续命令留下了影响。
实际上,cnd i>nul j>nul 又会将[j]的原内容暂存于再一个未用空间内,所以
cnd 2>nul 3>nul 对输出的改变,能够用cnd 2>&3 4>&3恢复回来。
由于暂存位置由系统选择,作为用户无法左右,所以数值不能肯定。
(我的每次试验为了保证句柄空间的确定,都是重新进入cmd.)
|
|
2006-5-12 13:17 |
|
|
willsort
元老会员
Batchinger
积分 4432
发帖 1512
注册 2002-10-18
状态 离线
|
『第
19 楼』:
Re arding:
Quote: | 由于暂存位置由系统选择,作为用户无法左右,所以数值不能肯定 |
|
我在13楼中猜测,cmd将其修改前的句柄存放在“从未访问过的未定义句柄中(3-9)”。这里再明确一下,其中的“从未访问过”,是指在当前的cmd命令行中用户从未显式指定过,而并非cmd本身未使用过,而“从未访问过”的句柄可能有多个,而cmd会选择第一个。如果你有反面的例证,不妨提出。
|
※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得! |
|
2006-5-13 18:49 |
|
|
willsort
元老会员
Batchinger
积分 4432
发帖 1512
注册 2002-10-18
状态 离线
|
『第
20 楼』:
Re arding:
我自己得到了反证,在执行了以下两句后,命令行仍然被屏蔽了。
echo test 3>nul
echo test 1>nul 3>nul
也就是说,我们尽管在第一句中已经访问了句柄3,但仍然可以在第二句中使用3>nul来改变备份的句柄stdout[1]。
因此,cmd的句柄备份策略可能是这样:首先使用未定义句柄3,如果检测到这个句柄处在备份状态时被改动,则换用下一个句柄。
另外还有一些发现:
1、cd 1>nul 2>nul 3>nul 4>nul 可以直接改变stdout和stderr的输出;
2、cd 0<nul 3<nul 或者 cd 0<nul 3>nul 将导致cmd不断回显命令行提示;
3、cd 0<nul 3<file 则直导致 cmd 窗口被关闭;
4、cd 1>nul 3>nul 后,cls 的行为也会失效,因此确证cls也是一种输出行为;
最后,关于句柄的复制,实际上可以理解为句柄的重定向,只是此次重定向的目标不再是设备或者文件,而是另一个句柄。
打个比方说,设备或文件是一个蓄水池,句柄就是其管道,命令则是管道上的水泵或者过滤器,而cmd就是一个自成一体的水循环系统。水池的管道从0-9编号,共有10条,0#管为进水管,1#管为排水管,2#管为故障测试管,3-9#管则是未使用的备用管。而0<实际上是打开进水管的阀门,1>则是打开排水管的阀门,而1>&2则打开将1#管到2#管的连接阀。而>nul的则是用水泵将水扬空。
|
※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得! |
|
2006-5-14 17:15 |
|
|
arding
初级用户
积分 90
发帖 38
注册 2006-1-6
状态 离线
|
『第
21 楼』:
Re Willsort:
通过反复试验,可以猜测系统的句柄使用策略,比如
Quote: | cnd 2>nul 3>nul 对输出的改变,能够用cnd 2>&3 4>&3恢复回来。 |
|
一句中的 4 便是猜测的结果,这也是基于刚刚进入cmd,句柄的使用情况比较清楚地情况下的猜测。
如果在一个批处理中反复使用了句柄重定向,则难以判断其句柄空间的情况,所以我说“系统决定,用户难以左右”。
我同意你的关于“未用句柄”的概念,测试也证实了这个概念。实际上,我感觉到明确的概念至关重要,反之则贻害无穷。就像windows帮助那些似是而非的说明,只会使人更加糊涂。
|
|
2006-5-15 11:38 |
|
|
weilong888
银牌会员
积分 1270
发帖 548
注册 2004-5-31
状态 离线
|
|
2006-10-12 08:00 |
|
|
pengfei
银牌会员
积分 1218
发帖 485
注册 2006-7-21 来自 湖南.娄底
状态 离线
|
『第
23 楼』:
经典, 又扩展思路了, 句柄重定向!
|
|
2006-10-12 09:47 |
|
|
soker
初级用户
积分 30
发帖 15
注册 2005-8-13
状态 离线
|
『第
24 楼』:
看不懂啊~ 努力ing......
|
|
2006-10-12 10:15 |
|
|
qq82015930
中级用户
积分 235
发帖 109
注册 2006-8-24
状态 离线
|
|
2006-10-12 11:41 |
|
|
lxmxn
版主
积分 11386
发帖 4938
注册 2006-7-23
状态 离线
|
『第
26 楼』:
两位实在是令人敬佩,但最终给人的感觉,还是没有明确说明句柄重定向的原理,尽管举了几个例子。
|
|
2006-10-12 13:34 |
|
|
electronixtar
铂金会员
积分 7493
发帖 2672
注册 2005-9-2
状态 离线
|
『第
27 楼』:
知道有这回事就行啦。不懂的看Linux Shell入门
|
C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>" |
|
2006-10-12 21:55 |
|
|
jinnee
新手上路
积分 8
发帖 2
注册 2006-4-24
状态 离线
|
『第
28 楼』:
看了这篇文章大长见识,不过还希能有高手来指点大家,顶一下
|
|
2006-10-14 03:41 |
|
|
jianyaogao
初级用户
积分 49
发帖 22
注册 2005-8-4
状态 离线
|
|
2007-3-17 20:29 |
|
|
axi
中级用户
脚本爱好者
积分 238
发帖 93
注册 2007-3-11 来自 GZ
状态 离线
|
『第
30 楼』:
哗!这些学识是从哪里学的呢,高深到极!
|
|
2007-3-18 01:43 |
|