回答:
コマンドを実行し、決して戻りません。return
関数のステートメントのようなものです。
コマンドが見つからない場合exec
はfalseを返します。コマンドが見つかるとまったく返されないため、trueは返されません。コマンドのSTDOUT
、STDERR
または終了ステータスを返す意味もありません。perlfunc
これは関数なので、ドキュメント はにあります。
コマンドを実行し、コマンドが終了した後、Perlスクリプトが続行されます。
戻り値はコマンドの終了ステータスです。これに関するドキュメントはにあり perlfunc
ます。
like system
はコマンドを実行し、コマンドが終了した後もperlスクリプトが続行されます。
system
戻り値とは逆にSTDOUT
コマンドのです。
qx//
バックティックと同じです。あなたはそれについてのドキュメントを見つけることができるperlop
とは違っているため、system
そしてexec
それが演算子です。
上記に欠けているのは、コマンドを非同期で実行する方法です。つまり、perlスクリプトとコマンドが同時に実行されます。これはopen
。コマンドの読み取りSTDOUT
/ STDERR
書き込みができますSTDIN
。ただし、プラットフォームに依存します。
このタスクを容易にすることができるいくつかのモジュールもあります。ありIPC::Open2
、IPC::Open3
そしてIPC::Run
Win32::Process::Create
、Windows を使用している場合も同様
です。
一般的なIの使用ではsystem
、open
、IPC::Open2
、またはIPC::Open3
私が何をしたいかによって異なります。qx//
オペレータは、シンプルながら、あまりにも迅速なハックの非常に便利な外であることをその機能に制約されます。私が見つけるopen
ずっと手軽に。
system
:コマンドを実行し、コマンドが戻るのを待ちますsystem
コマンドを実行し、その出力を気にせず、コマンドが完了するまでPerlスクリプトに何もさせたくない場合に使用します。
#doesn't spawn a shell, arguments are passed as they are
system("command", "arg1", "arg2", "arg3");
または
#spawns a shell, arguments are interpreted by the shell, use only if you
#want the shell to do globbing (e.g. *.txt) for you or you want to redirect
#output
system("command arg1 arg2 arg3");
qx//
または ``:コマンドを実行してそのSTDOUTをキャプチャしますqx//
コマンドを実行し、STDOUTに書き込む内容をキャプチャし、コマンドが完了するまでPerlスクリプトが何もしないようにする場合に使用します。
#arguments are always processed by the shell
#in list context it returns the output as a list of lines
my @lines = qx/command arg1 arg2 arg3/;
#in scalar context it returns the output as one string
my $output = qx/command arg1 arg2 arg3/;
exec
:現在のプロセスを別のプロセスに置き換えます。コマンドを実行し、その出力を気にせず、コマンドが戻るのを待ちたくない場合に、とexec
一緒fork
に使用します。 system
本当に
sub my_system {
die "could not fork\n" unless defined(my $pid = fork);
return waitpid $pid, 0 if $pid; #parent waits for child
exec @_; #replace child with new process
}
waitpid
およびのperlipc
マニュアルを読むこともできます。
open
:プロセスを実行し、そのSTDINまたはSTDERRへのパイプを作成しますopen
プロセスのSTDINにデータを書き込んだり、プロセスのSTDOUTからデータを読み取ったりしたい場合に使用します(ただし、両方を同時にはできません)。
#read from a gzip file as if it were a normal file
open my $read_fh, "-|", "gzip", "-d", $filename
or die "could not open $filename: $!";
#write to a gzip compressed file as if were a normal file
open my $write_fh, "|-", "gzip", $filename
or die "could not open $filename: $!";
IPC::Open2
プロセスのSTDINおよびSTDOUTを読み書きする必要がある場合に使用します。
use IPC::Open2;
open2 my $out, my $in, "/usr/bin/bc"
or die "could not run bc";
print $in "5+6\n";
my $answer = <$out>;
IPC::Open3
プロセスの3つの標準ファイルハンドルをすべてキャプチャする必要がある場合に使用します。例を書きますが、IPC :: Open2とほとんど同じように機能しますが、引数と3番目のファイルハンドルの順序が少し異なります。
exec関数はシステムコマンドを実行して戻りません - 戻りたい場合は、execではなくsystemを使用してください
最初にforkが実行され、親プロセスが子プロセスの完了を待機することを除いて、 exec LISTとまったく同じことを行います。
execおよびsystemとは対照的に、バックティックは戻り値を提供しませんが、収集されたSTDOUTを提供します。
(おそらく)補間され、/ bin / shまたは同等のコマンドを使用してシステムコマンドとして実行される文字列。シェルのワイルドカード、パイプ、リダイレクトが優先されます。収集されたコマンドの標準出力が返されます。標準エラーは影響を受けません。
STDOUT、STDERR、または戻りコードをフェッチするより複雑なシナリオでは、IPC :: Open2やIPC :: Open3などのよく知られた標準モジュールを使用できます。
例:
use IPC::Open2;
my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'some', 'cmd', 'and', 'args');
waitpid( $pid, 0 );
my $child_exit_status = $? >> 8;
最後に、CPANからのIPC :: Runも一見の価値があります…
Perlのバッククォート(の違いは何だ`
)、system
とはexec
?
exec -> exec "command"; ,
system -> system("command"); and
backticks -> print `command`;
exec
exec
コマンドを実行し、Perlスクリプトを再開することはありません。これreturn
は、ステートメントが関数に対するスクリプトのようなものです。
コマンドが見つからない場合は、exec
falseを返します。コマンドが見つかると、まったく返らないため、trueを返すことはありません。コマンドのSTDOUT
、STDERR
または終了ステータスを返す意味もありません。これは関数なので、perlfuncでドキュメントを見つけることができます。
例えば:
#!/usr/bin/perl
print "Need to start exec command";
my $data2 = exec('ls');
print "Now END exec command";
print "Hello $data2\n\n";
上記のコードには3つのprint
ステートメントがありますがexec
、スクリプトを終了するため、最初の印刷ステートメントのみが実行されます。また、exec
コマンド出力はどの変数にも割り当てられていません。
ここでは、最初のprint
ステートメントの出力を取得し、ls
標準出力でコマンドを実行するだけです。
system
system
コマンドを実行し、コマンドが終了するとPerlスクリプトが再開されます。戻り値はコマンドの終了ステータスです。これに関するドキュメントはperlfuncにあります。
例えば:
#!/usr/bin/perl
print "Need to start system command";
my $data2 = system('ls');
print "Now END system command";
print "Hello $data2\n\n";
上記のコードには、3つのprint
ステートメントがあります。system
コマンドの後にスクリプトが再開されると、3つの印刷ステートメントすべてが実行されます。
また、実行結果system
はに割り当てdata2
られますが、割り当てられた値は0
(からの終了コードls
)です。
ここでは、最初のprint
ステートメントの出力、次にls
コマンドの出力、続いprint
て標準出力の最後の2つのステートメントの出力を取得しています。
`
)のようsystem
に、コマンドをバッククォートで囲むとそのコマンドが実行され、コマンドが終了するとPerlスクリプトが再開されます。とは対照的にsystem
、戻り値はSTDOUT
コマンドのものです。qx//
バックティックと同じです。システムおよびとは異なり、これはオペレーターであるため、perlopでそれに関するドキュメントを見つけることができますexec
。
例えば:
#!/usr/bin/perl
print "Need to start backticks command";
my $data2 = `ls`;
print "Now END system command";
print "Hello $data2\n\n";
上記のコードには3つのprint
ステートメントがあり、3つすべてが実行されています。の出力はls
直接標準出力に送られるのではなく、変数に割り当てられdata2
、最後の印刷ステートメントによって印刷されます。
「exec」と「system」の違いは、execが現在のプログラムを「command」に置き換え、決してプログラムに戻らないことです。一方、システムは、「コマンド」をフォークして実行し、実行が完了すると「コマンド」の終了ステータスを返します。バックティックは「コマンド」を実行し、標準出力を表す文字列を返します(画面に出力されたものは何でも)。
popenを使用してシェルコマンドを実行することもできます。シェルモジュール-一般的なシェルコマンドへの透過的なアクセスを提供する 'use shell'があると思います。
それがあなたのためにそれを明らかにすることを願っています。
use Shell;
(search.cpan.org/dist/Shell/Shell.pm)?それは広くインストールされておらず、質問にも当てはまらないと思います...