子プロセスで"-|"でopenして、そこに標準出力で/usr/bin/grepの実行結果を出力し、そのデータを取得したいです。
$pid = open(FIFO, "-|")をした時点で、$pidにはプロセスIDが入っています(0以外)。
0のときは子プロセスが起動しているのでgrepを実行し、0以外であれば標準出力の内容を取得するというロジックでいいと考えたのですが、一度もgrepが実行されません。
また、grepをexecしているのですが、その第二引数を何にしていいのかも模索中です。
どこをどのように修正したらいいでしょうか。
よろしくお願いします。
die "openエラー: $!" unless defined ($pid = open(FIFO, "-|"));
if(!$pid) {
exec('/usr/bin/grep', '-isl', $search, @list) or die "grepエラー: $!";
} else {
while (<FIFO>) {
print $_;
}
close FIFO;
}
【環境】
WindowsXP Professional(SP2)
Apache2.2
ActivePerl v5.8.8
No.2ベストアンサー
- 回答日時:
質問の例では双方向のやり取りは必要ないので、
#1の tacosan さんの回答の通りで
open my $fd, "grep -isl '$search' @list"or die $!;
とでもすればよいのではないかと。
ついでにいうと、このパターンの場合、Unixのような
fork & exec が必要なので、ActivePerlでは
期待通りに動きません。
というかopenのところで
'-' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
となると思うんですが。
ついでのついでで、三引数バージョンの open ならActivePerlでもいけます。
open my $fifo, "-|", 'grep -e use *.pl' or die;
#open(my $fifo, '-|') || exec 'grep', '-e', 'use', '*.pl';
#↑こっちはダメ
while (<$fifo>) {
print;
}
もし
Perlの標準出力からデータを送る→
プログラムで処理してその標準出力に送る→
Perlで受け取る
ということをやりたいのなら、
IPC::open2 とか IPC::open3 とかつかってください。
ご回答ありがとうございます。
画面で操作して結果を見ているので、openのエラーをうまく拾えていないのかもしれません。そこはログを見てみようと思います。
最終的にはUnix上で動かすので、そのあたりも加味して、IPC::open2、IPC::open3も含めもう一度見直してみようと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux bashでブランク(空白)を検索文字列として指定する方法 1 2022/04/13 22:29
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- その他(プログラミング・Web制作) bashのgrepで複数の検索、かつスクリプト内で改行する方法を教えてください。 1 2022/10/06 20:09
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- UNIX・Linux AWSのEC2のZabbixユーザーでawscliコマンドが実行できない状態を解決する 1 2022/12/06 22:17
- UNIX・Linux Linuxのbash環境下です。 1 2022/11/27 12:31
- その他(プログラミング・Web制作) mariadbでのエラー 1 2022/11/15 12:31
- UNIX・Linux cronの@rebootでのdateコマンドの実行につきまして 2 2023/06/11 16:23
- UNIX・Linux cronでシェルスクリプト実行時のkubactlコマンドが機能しない対処法。 2 2022/08/03 18:58
- その他(プログラミング・Web制作) ラズパイ上の、pythonのエラーについて 1 2023/04/12 23:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
while(<ハンドラ>) {} で行数を...
-
AutoCADのスクリプト
-
オープンしたファイルで行の連結
-
cgiの投票回数制限設定について...
-
Perl で syntax error
-
perlで、文字列の中から何番目...
-
perlのflock関数でロックをかけ...
-
文字列をカウントする方法
-
ファイル全てを .xlsm に変更し...
-
一定時間が経過したフォルダの削除
-
csvファイルの横方向への改行に...
-
画像アップロード機能を追加し...
-
batファイルでrenameができませ...
-
while文がうまく動かない
-
VBAでCSVファイルの特定行を書...
-
MATLABのm-fileについて
-
配列のサイズを動的に拡張
-
ディレクトリのファイル作成を...
-
ANSI Cでファイル名、ディレク...
-
VB6.0でDB接続する際に切断時の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
close()で例外が投げられる理由
-
perlのflock関数でロックをかけ...
-
改行コードが勝手に
-
巨大ファイルの行をを逆順に並...
-
オープンしたファイルで行の連結
-
Perl で syntax error
-
where can I buy snowbord in t...
-
open中のファイルをrename
-
perlを用いた特定文字列間の抽...
-
Perlで他サイトの情報を取得し...
-
die関数のエラー出力先について
-
ハッシュにファイルハンドル
-
サブスクリプトとのファイルハ...
-
テキストファイルの本文中に行...
-
perlで大容量CSVのsort方法につ...
-
フォルダが開かなくなりました。
-
AutoCADのスクリプト
-
ジョブショップスケジューリング
-
バッチファイルの作り方(CSV→...
-
awkスクリプトでダブルクォーテ...
おすすめ情報