2016-09-25 8 views
-2

Perlでは、あるコマンドの出力を別のコマンドの出力にパイプする方法はありますか?Perlでは、あるコマンドの出力を別のコマンドの入力にどのようにパイプしますか?

私はそれをシェルが行うのと同じ方法で行いますが、シェルを使わないで行います。

私はシェルを使ってこれを行うことができ、コマンドに引数をエスケープすることができますが、私はシェルを使いたくありません。私はまた、CPAN上のものとは対照的に、Perlで配布されるモジュールの使用を好むでしょう。

forkexecを手動で使用できますが、Windowsでは動作しません。

+1

は、あなたが何をしたいの例を与えることができ、あなたはすでに持っているもののコード? –

+1

あなたが試してみたことや冒険したことをお見せしてください。 – zdim

答えて

6

IPC::Runを使用すると簡単です。例えば

run \@cmd1, '|', \@cmd2; 

prog0

#!/usr/bin/perl 
use IPC::Run qw(run); 
print("The parent's PID is $$\n"); 
run([ 'prog1' ], '|', [ 'prog2' ]); 

prog1

#!/usr/bin/perl 
print("cmd1's parent's PID is ".getppid()."\n"); 

prog2

から

出力:

The parent's PID is 6619 
Got <<cmd1's parent's PID is 6619>> 
cmd2's parent's PID is 6619 
+0

サードパーティのライブラリを使用しています。私は標準ライブラリを使ってそれをやりたいと思っています。 – Demi

+0

ここでIPC :: Runをコピーするようにお願いしていますか? – ikegami

+0

私は基本的にここで基本的な操作を探しています。具体的には、 'fork()' + 'exec()'(Unix)または 'CreateProcess()'(Windows)を呼び出すPerlプリミティブを探しています。それで、パイプを使って残りの部分を実装することができます。問題はその原始的なものである。 Windowsでも 'fork()'を使ってやっているのですか、あるいはPerlがもっと良い方法を持っていますか? – Demi

0

execを使用する:

perl -e 'exec(bash => (-o => "pipefail", -c => "find . -type f|xargs ls -l"));' 

または

perl -e 'exec("bash", "-o", "pipefail", "-c", " find . -type f|xargs ls -l"); 
+0

それは私がしたくないシェルを使用します。 – Demi

関連する問題