問題を再現するための条件を作成しましたが、すべてうまくいきました。
caller.pl:
#! /usr/bin/perl
$cmd = "echo 'a\\
b\\
c\\
d\\
e\\
f' | ~/doc/Answers/src/pltest/cmd1.csh";
sub system_tcsh
{
@args = ("tcsh", "-c", $cmd);
return system(@args);
}
system_tcsh
cmd1.csh:
#! /bin/csh
echo "${0}(cmd1) $argv[*]"
set line1 = $<
set line2 = $<
set line3 = $<
setenv lineno 3
echo "cmd1: read: $line1 $line2 $line3"
./cmd2.csh
cmd2.csh:
#! /bin/csh
echo " ${0}(cmd2) $argv[*] now running..."
./cmd3.csh
./cmd3.csh
set line6 = $<
echo " ${0}: Read: $line6"
cmd3.csh:
#! /bin/csh
# cmd3
set line = $<
echo " ${0}: Read: '$line'"
テスト走行:
frayser@gentoo ~/doc/Answers/src/pltest $ ./caller.pl
/export/home/frayser/doc/Answers/src/pltest/cmd1.csh(cmd1)
cmd1: read: a b c
./cmd2.csh(cmd2) now running...
./cmd3.csh: Read: 'd'
./cmd3.csh: Read: 'e'
./cmd2.csh: Read: f
たぶん、これを変更して問題を再現したり、ソリューションを実装するために使用したりできます。
-
UPDATE
これは、Perl STDINの問題を再現し、その回避策を提供する更新です。
cmd3をPerlバージョンに置き換えると、報告された問題のある結果が得られます。
cmd3.cshを置き換えるcmd3.pl:
#! /usr/bin/perl
# cmd3
$_=<STDIN>;
chomp();
print " $0: Read: '$_'\n";
結果:cmd3.plを使用します。「d」が読み取られると、それ以上の入力は利用できなくなります。
./caller.pl
./cmd1.csh(cmd1)
cmd1: read: a b c
./cmd2.csh(cmd2) now running...
./cmd3.pl: Read: 'd'
./cmd3.pl: Read: ''
./cmd2.csh: Read:
この状況を改善するために、cmd2は1行のみをcmd3に送信するように変更されています。行(1)コマンドはこれを簡単に実行します。
#! /bin/csh
echo " ${0}(cmd2) $argv[*] now running..."
line | ./cmd3.pl
line | ./cmd3.pl
set line6 = $<
echo " ${0}: Read: $line6"
これは、ラインコマンドを実行するオーバーヘッドを回避するために最適化されたcmd2.cshです。
#! /bin/csh
echo " ${0}(cmd2) $argv[*] now running..."
set x = $<
echo $x | ./cmd3.pl
set y = $<
echo $y | ./cmd3.pl
set line6 = $<
echo " ${0}: Read: $line6"
これは、更新されたcmd2.cshの出力です。機能は、Perlを使用 した場合と最終スクリプトとしてcshを使用した場合と同じになりました。stdinが失われることはありません。
./cmd1.csh(cmd1)
cmd1: read: a b c
./cmd2.csh(cmd2) now running...
./cmd3.pl: Read: 'd'
./cmd3.pl: Read: 'e'
./cmd2.csh: Read: f