more
Perlスクリプトでコマンドを使用する方法はありますか?ファイルがあり、その内容を印刷したいのですが、行が多いので、で印刷したいと思いますmore
。バックティックを入れてみmore
ましたが、うまくいきませんでした。
open(FILE,'/opt/myfile' ) or die("Could not open file.");
`more /opt/myfile`;
more
Perlスクリプトでコマンドを使用する方法はありますか?ファイルがあり、その内容を印刷したいのですが、行が多いので、で印刷したいと思いますmore
。バックティックを入れてみmore
ましたが、うまくいきませんでした。
open(FILE,'/opt/myfile' ) or die("Could not open file.");
`more /opt/myfile`;
`more /opt/myfile`
コマンドの出力を文字列にキャプチャすることを意味しmore
ます。文字列は破棄されます(通常、出力を変数に格納するか、関数に渡します)。その出力が端子に接続されていない場合は、more
と同等でcat
あり、何の役にも立ちません。
出力をキャプチャせずにPerlでサブプロセスを実行するには、system
関数を使用します。
system('more', '/opt/myfile');
単なる文字列ではなく、コマンドとその引数を含むリストを渡す必要があることに注意してください。に単一の文字列をsystem
渡すと、シェルに渡され、ファイル名の特殊文字が展開されます。たとえば、機能しますsystem('more /opt/myfile')
がsystem('more /opt/$(rm -rf ~)')
、すべてのファイルが削除されます。複数の引数を渡す場合、シェルは関与しません。その奇妙な名前のファイルをsystem('more', '/opt/$(rm -rf ~)')
呼び出します。more
+
ファイル名がまたはで始まるリスクがある場合は、ファイル名の前-
に渡し--
て、オプションとして解釈されないようにします。
を呼び出すのではなく、環境変数more
を確認し、定義されている場合はそれを呼び出す必要があります。デファクトスタンダードのポケットベルです。変数が定義されていない場合、このミレニアムでは、デフォルトで設定する必要があります(妄想的な場合は、デフォルトで存在する場合など)。PAGER
$PAGER
less
less
more
my $pager = $ENV{PAGER};
if (!defined $pager || $pager eq '') {
$pager = 'less';
}
system($pager, '--', '/opt/myfile');
システムコマンドを使用するだけです。
system('more thefile');
私はおそらく次のようなポケットベルへのパイプを開くでしょう:
open(FILE, "/opt/myfile") or die("Could not open file.");
open(PIPE, "| more") or die("Could not open pipe");
while(<FILE>) {
print PIPE;
}
close P;
close FILE;'