这是哪里 当我将 STDOUT 重定向到 Perl 中的 PTY 时来自?

问题描述 投票:0回答:2

使用以下代码:

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...)]

我得到的输出是:

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

但是,在最后一行,我希望收到“bar “。另外,我在 Linux 下运行 Perl,所以这个 LF 到 CRLF 的废话不应该是一个问题吗?

perl newline tty
2个回答
3
投票

\r
\n
是“控制字符”。 “控制角色”在控制什么?打字机。好吧,它曾经是。

TTY 早于计算机,可以追溯到电报。 TTY代表电传打字机;从字面上看,它是一台打字机。因为它是一台打字机,所以需要告诉它滑动(返回)打印头(托架)回到页面的第一列,然后将纸张前进到下一行。

\r\n
.

现在这已经融入了 tty 协议。尽管技术在不断发展,但它仍然表现得像在和打字机说话。

另请参阅为什么在脚本 (1) 的输出中换行符是 CR + LF(dos 风格)?


1
投票

正如用户 Schwern 所说,问题是由 TTY 本身引起的。 我通过在 TTY 上使用原始模式解决了它。

$pty->slave->set_raw();
$pty->set_raw();
© www.soinside.com 2019 - 2024. All rights reserved.