我们有以下代码(在python中):
print("something\r any")
在控制台中运行时,这正确地产生:
anything
(印刷后 something
,插入符号返回到开头 相同 行,然后覆盖前四个字符 any
)
但是,重定向中的相同命令将产生:
something
any
哪个不对。为什么会这样?有没有什么可以告诉shell在重定向时重写当前行?
关于CR和LF的定义:
我们有以下代码(在python中):
print("something\r any")
在控制台中运行时,这正确地产生:
anything
(印刷后 something
,插入符号返回到开头 相同 行,然后覆盖前四个字符 any
)
但是,重定向中的相同命令将产生:
something
any
哪个不对。为什么会这样?有没有什么可以告诉shell在重定向时重写当前行?
关于CR和LF的定义:
Answers:
重定向输出时,字节将写入目标未处理。您如何想象,例如,用于颜色处理的ANSI序列在重定向时可能会被“处理”?与CR相同。它只是写入输出。
应用程序可能会检测到它们未连接到真正的tty设备并选择不同的模式,在内部“处理”代码。也许,ncurses应用程序会这样做,但我相信这是礼貌。
另一方面,当你 cat
要么 type
捕获的文件,原始代码将由tty设备处理。
回车应该将光标返回到左边距。这是基本功能。换行应该将光标向下移动一行。某些软件/硬件只会执行基本功能。然而,其他软件/硬件将裸支架返回和/或裸线馈送作为回车/换行对。你看到的是这种行为的变化。
各种O / S和其他软件使用裸回车或裸线进给作为线路终结器。它们通常会通过前进到下一行的开头来渲染行终止符。行为体验要求控制台在发送换行符时插入回车符。使用该命令禁用此行为后,尝试运行程序 stty -onlcr
。这可以通过命令反转 stty onlcr
要么 stty sane
。
print语句的输出未经处理,并在控制台上提供正确的输出。如果您使用的是其他终端,则可能会获得与管道传输时相同的结果。