为什么重定向中的回车处理不当?


2

我们有以下代码(在python中):

print("something\r any")

在控制台中运行时,这正确地产生:

 anything

(印刷后 something,插入符号返回到开头 相同 行,然后覆盖前四个字符 any

但是,重定向中的相同命令将产生:

something
 any

哪个不对。为什么会这样?有没有什么可以告诉shell在重定向时重写当前行?

关于CR和LF的定义:

换行意味着向前移动一行。代码是\ n。回车意味着将光标移动到行的开头。代码是\ r \ n。

Answers:


3

重定向输出时,字节将写入目标未处理。您如何想象,例如,用于颜色处理的ANSI序列在重定向时可能会被“处理”?与CR相同。它只是写入输出。

应用程序可能会检测到它们未连接到真正的tty设备并选择不同的模式,在内部“处理”代码。也许,ncurses应用程序会这样做,但我相信这是礼貌。

另一方面,当你 cat 要么 type 捕获的文件,原始代码将由tty设备处理。


好吧,我认为通过仅删除颜色代码(并正确处理CR)在重定向中完成处理是完全可以接受的。
Synxis

那么,当你将输出重定向到只提供顺序访问的设备时,你怎么想?(在我们的例子中写)?类型编写器或CD-R,DVD-R编写器就是例子。应用程序不知道什么会进一步,它无法预测何时会出现没有LF的CR。那么,您希望在每个可能运行的应用程序中看到缓存输出的能力吗?包含kilo和mega-bytes的行怎么样,非常适合xml / json / scripts?这将是某些申请的礼貌,没有任何保证...... p
Maximus

对于这种情况,shell可以独立缓冲最后一个未终止的行,但是你有一个带有巨大的xml / json行的点。也许应该有一个选择......
Synxis

-1

回车应该将光标返回到左边距。这是基本功能。换行应该将光标向下移动一行。某些软件/硬件只会执行基本功能。然而,其他软件/硬件将裸支架返回和/或裸线馈送作为回车/换行对。你看到的是这种行为的变化。

各种O / S和其他软件使用裸回车或裸线进给作为线路终结器。它们通常会通过前进到下一行的开头来渲染行终止符。行为体验要求控制台在发送换行符时插入回车符。使用该命令禁用此行为后,尝试运行程序 stty -onlcr。这可以通过命令反转 stty onlcr 要么 stty sane

print语句的输出未经处理,并在控制台上提供正确的输出。如果您使用的是其他终端,则可能会获得与管道传输时相同的结果。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.