0

STDINファイル記述子から読み込もうとしていました/dev/fd/0

これは私が書いたものです。コマンド シェルで入力したすべてのコマンドを出力したいだけです。私はこれをPerlで書きましたが、十分ではありません:

#!/usr/bin/perl

use strict;
use warnings;

open my $fh, "<", "/dev/fd/0" or die "bububububu";
while (<$fh>) {
print $_."\n";
}
close $fh;

そのため、スタックしても何も印刷されません。やり方知ってる人いる???これが不可能な場合は、すべてのコマンドをファイルに入れて、「0」ファイル ハンドルから何らかの方法で読み取ることができます。システムを通過するすべてのコマンドをキャプチャしたいだけです。

サンプルファイル:

#!/usr/bin/perl

use strict;
use warnings;

system("./.file2");

そして file2 は次のとおりです。

echo this is hard!!!

だから私は自分のプログラムに最初のファイルを実行させたいと思っています。'0' ファイルハンドルを読み取るとき、何らかの方法ですべての行を配列に格納したいと考えています。

主な編集:あなたは私を誤解していると思います。STDIN とその仕組みについて知っています。問題は、STDIN からの入力のためにスクリプトを読み取らせたくないということです。シェル プロンプトに入力した内容からスクリプトを読み取りたい。ファイルを実行し、別のターミナルを開き、ターミナルにコマンドを入力するとします。スクリプトでこれらの行を認識し、配列に保存する必要があります。

4

2 に答える 2

2

禁止、あなたがやろうとしていることはうまくいかないと思います。ハンドルは/dev/fd/0プロセスごとに異なります (開くと、基本的にfhは親プロセスによって継承されたもののコピー/複製が作成されます)。そのため、perl で開くファイル ハンドルは、bash の場合と同じではありません。

ただし、ここには(少なくとも)2つのオプションがあると思います。

  1. アプローチでコマンドを読み取り、while( <STDIN> )それらをファイルに保存し、シェルに渡すsystem()$qx()、シェルによって実行されますが、これはコマンドごとにシェルを開始するため、単純なアプリケーションでのみ機能します。ただし、サブ子でシェルを開き、その STDIN/STDOUT ファイルハンドルを perl ファイルハンドルに接続して、新しいコマンドをパイプし、入力を読み取ることで、これを回避できます。詳細についてはperldoc perlopentut、(パイプを開くセクション) および/またはIPC::Open2( http://search.cpan.org/~rjbs/perl-5.18.0/ext/IPC-Open3/lib/IPC/Open2.pm ) を参照してください。と組み合わせるとTerm::ReadLine、シェルの完全な入力方法をエミュレートでき、すべてのコマンドをログに記録している間、ほとんど違いに気付かないでしょう。
  2. bash の履歴機能だけを使用しない理由はありますか(たとえば、ここを参照してください: http://www.talug.org/events/20030709/cmdline_history.html )。デフォルトでは、インタラクティブ セッションで実行するすべてのコマンドは に記録され~/.bash_history、`history.

アプリケーションがセキュリティ関連で、たとえばrootシステム上で行うことすべてをログに記録しようとしている場合はsudo、.

これがお役に立てば幸いです、クリスチャン

于 2013-08-07T08:35:45.243 に答える