2.19 如何在cmd中精准产生\r\n https://scz.617.cn/windows/202204101414.txt A: 2022-04-10 14:14 $ (echo | set /p="line 0" & echo= & echo | set /p="line 1") | xxd -g 1 00000000: 6c 69 6e 65 20 30 20 0d 0a 6c 69 6e 65 20 31 line 0 ..line 1 $ (echo | set /p="line 0" & echo= & echo | set /p="line 1") > any.txt $ xxd -g 1 any.txt 00000000: 6c 69 6e 65 20 30 20 0d 0a 6c 69 6e 65 20 31 line 0 ..line 1 "echo="后面有空格时,管道与输出转向均会在\r\n前面插入空格。 起初我有一个事后证明是错误的假设,以为管道与输出转向的语义一致,所以后续测 试均用管道转xxd代替生成文件再xxd,然后在错误的道路上越走越远。 最后测试表明,管道与输出转向的语义居然有不同,这是个坑。 $ (echo|set /p="line 0"&echo=&echo|set /p="line 1") | xxd -g 1 00000000: 6c 69 6e 65 20 30 20 0d 0a 6c 69 6e 65 20 31 line 0 ..line 1 \r\n前面会插入一个空格 $ (echo|set /p="line 0"&echo=&echo|set /p="line 1") > some.txt $ xxd -g 1 some.txt 00000000: 6c 69 6e 65 20 30 0d 0a 6c 69 6e 65 20 31 line 0..line 1 \r\n前面没有空格 两次测试"echo="后面均无空格,但用管道时,\r\n前面插入不符合预期的空格。 我在微博提问时为了不引入非自带的xxd,写的是输出转向,犯了"想当然"的错误。 先后有两名网友指出,只要"echo="后面不出现空格,用输出转向时\r\n前面就不会 出现空格,他们分别在XP、Win11上测试确认。但由于我已经"想当然"了,在XP、 Win7、Win10上测试时均用管道,始终无法消掉非预期的空格,事实上提问之前就测 试过"echo="后面无空格的情形。 无论如何,有两个互不相干的网友指出同一种可能,不大可能是OS不同带来的差异。 重新在不同版本OS和cmd中反复测试,意外确认管道与输出转向的语义有差异。曾经 怀疑是xxd本身的问题,设计新实验排除了这种可能。 (echo|set /p="line 0"&echo=&echo|set /p="line 1") | clip 打开notepad,粘贴剪切板内容,确认使用管道时有非预期空格出现。XP没有clip, Win7、Win10可做该实验。 原始需求是要写入文件的,用xxd只是为了更精确观察字节流,没想到有这种坑等着 我。回顾一下,犯了两个"想当然",一是未严格测试就假设管道与输出转向语义一致, 二是假设cmd太过成熟,没有版本差异,从而在提问时省略了OS版本描述,这都是反 面案例,大家不要学我,引以为戒。 不要用"echo."产生\r\n,这会导致cmd先去找外部命令echo,会有磁盘I/O。 下面这种古老的搞法也可以精准产生\r\n $ copy /y con some.txt line 0 line 1^Z Ctrl-Z表示输入结束 $ xxd -g 1 some.txt 00000000: 6c 69 6e 65 20 30 0d 0a 6c 69 6e 65 20 31 line 0..line 1