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

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

让我们有以下代码(这里是python):

print("something\r any")

在控制台中运行它时,它会正确生成:

 anything

(打印后something,插入符号返回到相同的行,然后用any)覆盖前四个字符

然而,重定向中的相同命令将产生:

something
 any

这是不正确的。为什么会这样?是否有东西可以告诉 shell 在重定向时重写当前行?

关于CR和LF的定义:

换行表示向前移动一行,代码为 \n。回车表示将光标移动到行首,代码为 \r。

答案1

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

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

另一方面,当您cattype该捕获的文件时,原始代码将由 tty 设备处理。

答案2

回车键应该将光标返回到左边距。这是基本功能。换行符应该将光标向下移动一行。某些软件/硬件只会执行基本功能。但是其他软件/硬件会将裸回车符和/或裸换行符视为回车符/换行符对。您看到的是此行为的变体。

各种操作系统和其他软件都使用裸回车符或裸换行符作为行终止符。它们通常会通过前进到下一行的开头来呈现行终止符。行为体验要求控制台在发送换行符时插入回车符。尝试在使用命令 禁用此行为后运行您的程序stty -onlcr。可以使用命令stty onlcr或反转此操作stty sane

打印语句的输出未经处理,并在控制台上给出正确的输出。如果您使用不同的终端,您可能会得到与管道处理时相同的结果。

相关内容