标题: [其他] [讨论]批处理重定向符号的任意位置效果相同 [打印本页]
作者: applba 时间: 2011-5-19 15:27 标题: [讨论]批处理重定向符号的任意位置效果相同
本帖最后由 applba 于 2011-5-19 23:44 编辑
任意位置效果相同。
>>1.txt echo abc def
echo>>1.txt abc def
echo abc>>1.txt def
echo abc def>>1.txt
测试代码- @echo off &echo.>1.txt
- >>1.txt echo abc def
- echo>>1.txt abc def
- echo abc>>1.txt def
- echo abc def>>1.txt
- start 1.txt
- pause
复制代码
作者: Hello123World 时间: 2011-5-19 16:38
你的研究总能给我不少启发。
作者: CrLf 时间: 2011-5-19 16:44
本质是,cmd对语句进行预处理的时候,把“(句柄名称)(重定向符号)(目标句柄或设备)”这一段识别出来再挪到语句末尾,所以放哪里都可以。
作者: applba 时间: 2011-5-19 17:10
3# zm900612
这个处理是由具体的命令进行的,此例是echo。
但是我认为呢,>>的处理和^是类似,是处理后消失,而不是移动到末尾。
作者: CrLf 时间: 2011-5-19 17:47
转义是转义,语句划分是语句划分,二者不一样的。这很容易证明,运行下列命令就知道了,注意看回显:- echo on
- echo afds^asdf
- echo sdf >con sef
- pause
复制代码
作者: applba 时间: 2011-5-19 18:11
本帖最后由 applba 于 2011-5-19 18:13 编辑
5# zm900612
^和>的功能肯定不一样。
我的意思说 处理后的效果:即处理后消失。
作者: CrLf 时间: 2011-5-19 22:19
怎么去区别“被处理后消失”和“被区分后失效”呢?
作者: powerbat 时间: 2011-5-19 22:31
任何功能符号在预处理后都“消失”了,它们只是用来告诉CMD按什么逻辑和规则执行语句。
一句话,“预处理时判定语句的结构和功能”。
作者: CrLf 时间: 2011-5-19 22:55
8# powerbat
唔,貌似这个说法更标准
作者: qzwqzw 时间: 2011-5-19 23:20
说法这么混乱
只因为大家对预处理的概念理解不一
预处理是个相对笼统的概念
在批处理开启echo on后
回显的命令行已经是预处理的结果
至于这以后对命令行的分析算不算预处理
没有标准的界限定义
而且不同命令的预处理过程也是不同的
作者: CrLf 时间: 2011-5-19 23:32
嗯,反正谁对我听谁的...
作者: applba 时间: 2011-5-19 23:47
本帖最后由 applba 于 2011-5-20 03:55 编辑
7# zm900612
首先,要识别出来它是特殊符号。
然后,解释其功能,即通常所说的(预)处理。
解释完了,特殊符号的使命就完成了,可以“消失”了
作者: qzwqzw 时间: 2011-5-20 08:26
可以确定的是
cmd对 & | > >> < & && ||的处理是大体上分为两步的
第一步是对这些符号进行整理
包括对> <添加默认句柄号
对以上符号前后预留空格
对< >以及句柄对应的文件移到语句尾部
第二步是对这些符号进行处理
创建打开文件
复制文件句柄等
处理完这些符号后
整体语句的分析就已已经结束
这里不存在刻意的符号丢弃或者消失
作者: applba 时间: 2011-5-20 20:07
13# qzwqzw
为什么会要移动呢,不是很理解。
我觉得这个重定向符号就像是一个信使,和人接头 了,就可以走了。
作者: qzwqzw 时间: 2011-5-20 20:19
忘了提到一点
cmd对 & | > >> < & && ||的两步处理是不连续的
中间夹杂着其它的一些命令行处理代码
第一步的所有整理操作
都是为了使命令行更加清晰和标准
让第二步的处理过程能够更加简便
作者: CrLf 时间: 2011-5-20 20:23
14# applba
请看5楼例子,不要关回显。
微软不开源,所以bat中很多似是而非的东西只好用不断推翻错误猜想的方式去探究,烦啊...
作者: applba 时间: 2011-5-20 20:34
看来我是搞不透这些个机制了,还是不搞了吧……
作者: powerbat 时间: 2011-5-20 20:48
把echo off去掉,一切了然。
首先当然无条件处理%,然后处理^,然后是qzw说的那些。
预处理结束后,那些功能符号当然“消失”了(对CMD来说)。因为已经创建了句柄,为管道两边的命令准备了创建进程所需参数,对语句块(包括&、&&、||等)确定了程序流程和逻辑,等等。比如,假设转换成C语言,
cmd1&cmd2&cmd3 → cmd1();cmd2();cmd3();
cmd1&&cmd2||cmd3 → cmd1() ? cmd2() : cmd3()
作者: applba 时间: 2011-5-20 20:54
把echo off去掉,一切了然。
结果我发现它真的移了……
作者: CrLf 时间: 2011-5-20 21:01
把echo off去掉,一切了然。
结果我发现它真的移了……
applba 发表于 2011-5-20 20:54
看来我白举例了...
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |