这是在将 STDOUT 重定向到 Perl 中的一个伪终端(PTY)时产生的。

huangapple go评论57阅读模式
英文:

Where does this \r\n come from when I redirect STDOUT to a PTY in Perl?

问题

以下是要翻译的内容:

"parent [1]: "foo\n"
child [1]: "foo\n"
child [2]: "bar\n"
parent [2]: "bar\r\n""

但是在最后一行,我预期收到 "bar\n"。而且,我在Linux下运行Perl,所以这个LF转CRLF的问题不应该存在,对吗?

英文:

With the following code:

use strict;
use warnings;
use utf8;

use IO::Pty;
use Data::Dump qw(pp);

my $pty = IO::Pty->new;
open *STDOUT, '>&', $pty->slave;

if ( my $pid = open *STDOUT, '|-' ) {
  # parent
  my $str = "foo\n";
  print {*STDERR} "parent [1]: ", pp($str), "\n";
  print {*STDOUT} $str;
  my $line = <$pty>;
  print {*STDERR} "parent [2]: ", pp($line), "\n";
} else {
  # child
  while (<>) {
    print {*STDERR} "child [1]: ", pp($_), "\n";
    s/foo/bar/;
    print {*STDERR} "child [2]: ", pp($_), "\n";
    print $_;
  } ## end while (<>)
  exit;
} ## end else [ if ( my $pid = open *STDOUT...)]

The output I get is:

parent [1]: "foo\n"
child [1]: "foo\n"
child [2]: "bar\n"
parent [2]: "bar\r\n"

But on the last line I expected to receive "bar\n". Also, I'm running Perl under Linux, so shouldn't this LF to CRLF nonsense be a non-issue?

答案1

得分: 6

\r\n 是"控制字符"。 "控制字符" 控制什么?是控制打字机的。嗯,以前是这样的。

TTYs 早于计算机,可以追溯到电报。TTY 代表电传打字机;它实际上是一种可以打印输出的打字机。由于它是一台打字机,需要告诉它将打印头(carriage)滑动(返回)到页面的第一列,然后将纸向下移动到下一行。\r\n

现在这个功能已经内置到 tty 协议中。尽管技术已经发展,但它仍然像与打字机通信一样工作。

另请参阅 script(1)输出中为什么换行是 CR + LF(dos 格式)?

英文:

\r and \n are "control characters". What are "control characters" controlling? A typewriter. Well, it used to.

TTYs pre-date computers, going back to telegraphs. TTY stands for teletype; literally a typewriter that types the output. As it was a typewriter, it needed to be told to slide (return) the print head (carriage) back to the first column of the page, and then advance the paper to the next line. \r\n.

Now that's baked into the tty protocol. Even though technology has moved on, it's still acting like it's talking to a typewriter.

See also Why in the output of script (1) the newline is CR + LF (dos-style)?

答案2

得分: 6

根据用户Schwern所指出,问题是由TTY本身引起的。
我通过在TTY上使用原始模式来解决了这个问题。

$pty->slave->set_raw();
$pty->set_raw();
英文:

As indicated by the user Schwern, the problem was caused by the TTY itself.
I solved it by using the raw mode on the TTY.

$pty->slave->set_raw();
$pty->set_raw();

huangapple
  • 本文由 发表于 2023年3月4日 02:56:47
  • 转载请务必保留本文链接:https://go.coder-hub.com/75630890.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定