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