2つのコマンドでstdinの入力を順番に使用させるにはどうすればよいですか?

2つのコマンドでstdinの入力を順番に使用させるにはどうすればよいですか?

次のPerlスクリプトはconsume-10-lines-and-exitstdinから10行を読み込み、印刷します。その後は終了します。

#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';

for (my $i = 0; $i < 10; $i++) {
    my $line = <STDIN>;
    print $line;
}

入力合計の最初の10行が消費され、最初のコマンドによって印刷され、残りが消費されるようにconsume-10-lines-and-exit合計を結合しようとしています。catcat

以下のコードスニペットは、期待どおりに1〜13の代わりに1〜10をすべて印刷します。

printf '1 2 3 4 5 6 7 8 9 10 11 12 13' \
    | tr ' ' '\n' | { perl consume-10-lines-and-exit; cat; }

printf '1 2 3 4 5 6 7 8 9 10 11 12 13' \
    | tr ' ' '\n' | ( perl consume-10-lines-and-exit; cat )

printf '1 2 3 4 5 6 7 8 9 10 11 12 13' \
    | tr ' ' '\n' | sh -c 'perl consume-10-lines-and-exit; cat'

コマンドが終了するまでstdinから入力を読み込み、次のコマンドが前のコマンドがハングしたところで続くようにコマンドをソートする構造はありますか?

ベストアンサー1

問題は、Perlがバッファリングされた入力を使用するので、使用したいよりも多くの行を事前に読み取るということです。次のバイト単位のバージョンを試してください。

perl -e '
use strict;
use warnings FATAL => "all";
for (my $i = 0; $i < 10; $i++) {
  my $line;
  while(sysread(*STDIN,my $char,1)==1){
      $line .= $char;
      last if $char eq "\n";
  }
  print $line;
}'

おすすめ記事