执行此命令时我正在玩 wmic
wmic<nul 3>nul
产生了这个:
奇怪的是,任何命令都可以工作,但只有流 3 导致输出泛滥。
我用谷歌搜索了 SO “cmd 输出泛滥”,找不到任何重复项或任何结果。
问题:为什么只流3个作品?
更新:同样,
>con 3<con :
完全禁用STDOUT
!
最佳答案
我认为,as pointed通过 aschipfl,my answer至 their question解释问题的根源是什么。
请引用他们的内部细节,这个答案只是解释不同行为的总结。
创建重定向时,
cmd
中的代码处理此任务会尝试避免将原始句柄保存到正在重定向的流中的问题,以便可以恢复重定向过程。但是所使用的函数(标准
_dup()
)的工作方式和创建重定向时使用的顺序可能会改变所使用的内部结构,最终反转重定向的代码会使用错误的信息。
简而言之:
<nul 3<nul wmic
-
<nul
保存stdin
处理&3
并分配nul
流向&0
-
3<nul
将句柄保存在&3
中进入&4
并分配nul
流向&3
-
wmic
被执行。因为它正在读取nul
(分配给&0
)它无法读取任何内容并结束。 -
&0
从&3
恢复它保存在哪里,但现在&3
指向nul
-
&3
从&4
恢复.现在它指向原来的stdin
在最初的 achipfl 问题中,观察到的行为是命令提示符关闭。代码执行后
< file1 3< file2 echo/
重定向取消进程离开 stdin
流指向磁盘文件 ( file2
)。 cmd
开始读取此文件以执行命令(因为它通常从 stdin
执行)并且在文件末尾读取操作失败并且 cmd
实例结束。如果你想以一种复杂的方式看到它在工作中启动记事本,你可以尝试
( >file1 echo notepad ) & ( <nul 3<file1 break )
但在这个问题中,行为是不同的,因为分配给 &3
的流, 将被复制到 stdin
一旦恢复重定向,就不是磁盘文件而是nul
<nul 3<nul echo/
- 一旦命令被执行并且重定向被恢复
stdin
流与nul
相关联设备 -
cmd
显示提示并尝试检索从nul
读取的新命令 - 读取操作结束但未检索任何内容,所以
cmd
不执行任何操作 - 转到2
问题“为什么只有 stream 3 有效?”(从某种意义上说它无效 ;))是不正确的。你可以做类似的事情
1>file1 <nul 4<nul echo/
并使用不同的流得到相同的结果。或者你可以做
3<nul <nul echo/
它会起作用(在它起作用的意义上)。
您请求流重定向的顺序,cmd
如何处理它们内部代码和仍然有效的先前重定向的存在可以决定命令的成功或失败。
关于windows - Stream 3 句柄重定向导致输出溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61934916/