2017-01-31 1 views
-2

(これは、Pythonや他のスクリプト言語に適用されますが)私は、次のPerlスクリプトを持っている:script1.plscript2.plscript3.plPython/Perlスクリプトを書き直すことなく、出力をbashスクリプトで一緒にパイプする方法はありますか?

これらのスクリプトが書かれた方法は、ユーザーが入力フラグとそれらを実行すると、出力が保存されたファイルです。 。

perl script1.pl --i input1.tsv ## this outputs the file `outputs1` 
perl script2.pl --i outputs1  ## this outputs the file `outputs2` 
perl script3.pl --i outputs2  ## this outputs the file `final_output` 

(Pythonistasの場合、これはpython script1.pyある)

今、私は、ユーザーが単にリターンfinal_outputinput1で動作し、出力を取得することができます実行可能なbashスクリプトを作成したいと思います。

ここで私が唯一のperlスクリプト、execute.shでこれを行うだろう方法は次のとおりです。私はパイプどのように、3つのスクリプトと私の例えば

#!/bin/sh 

source ~/.bash_profile 

FLAG1="--i=$1" 

perl script1.pl $FLAG1 
コマンドラインで実行することができ

execute.sh input1.tsv

う中間の出力を中間スクリプトに作成してexecute.shスクリプトを作成します。 outputs1script2.plに、outputs2scripts3.plに、

perl/pythonスクリプトを書き直すことなくこれを行う方法はありますか?

EDIT:追加情報:問題は、実際に出力がわからないことです。ファイル名は、元のinputs1.tsvに基づいて変更されます。さて、私は出力のファイル拡張子を知っていることは事実です。しかし、outputs1とoutputs2は同じファイル拡張子を持ちます。

+0

正しいファイル名でスクリプトを呼び出すことで、スクリプトを使用している場合を除き、手作業と同じようにスクリプトを呼び出します。マジックニードはありません。 – hobbs

+0

スクリプトに特定の入出力ファイルが必要ですか?通常は、 ' outputs2'(もちろんスクリプトを書くことができます) – Ryan

+1

スクリプトが常にハードワイヤードのファイル名を出力する場合、スクリプトを変更する以外の方法はありません。 – choroba

答えて

0

このような場合のベストプラクティスは、スクリプトをstdinから読み込んでstdoutに書き込むことです。その場合には、それは一緒にパイプに非常に容易になり、次のように:それは理想的ではないのですが、それはどうなる

#!/bin/sh 
perl script1.pl --i input1.tsv 
perl script2.pl --i outputs1 
perl script3.pl --i outputs2 

:あなたのケースでは

perl script1.pl < input1.tsv | perl script2.pl | perl script3.pl 

、次のようなスクリプトを書くことができあなたが欲しいもの。それはinput1.tsvを読み、outputs3を書きます。

+0

"あなたの場合、このようなスクリプトを書くことができます"上記のコメントを参照してください。問題は、実際に出力が何であるかわからないことです。ファイル名は、元のinputs1.tsvに基づいて変更されます。さて、私は出力のファイル拡張子を知っていることは事実です。しかし、outputs1とoutputs2は同じファイル拡張子を持ちます。 – ShanZhengYang

+0

'perl script1.pl ShanZhengYang

+0

私が言っていることは、自分で最初から書き込む機会があれば、stdinから読み込んでstdoutに書き込むように書くことをお勧めします。ファイル名には何の制約もありません。さまざまなスクリプトの出力ファイルの名前を知らず、予測できない場合は、自動化が難しくなります。ディレクトリ内のすべてのファイルの名前を取得し、スクリプトを実行し、再度名前を取得し、変更内容を確認するなどの作業を行うことができます。それはちょっとばかげているのですが、あなたにはもっと良いオプションがたくさんあるように思えます... –

-1

あなたの質問はこれを言うが、あなたは--oフラグを使用して出力ファイルを指定することも想定していません:

perl script1.pl --i input1.tsv --o /dev/stdout | perl script2.pl --i /dev/stdin --o /dev/stdout | perl script3.pl --i /dev/stdin --o final_output 

/dev/stdin/dev/stdoutは、それぞれのプロセスのstdinstdoutに書き込む魔法のUNIXファイルです。

+0

残念ながら、私は '--o'フラグを書く必要があります。 – ShanZhengYang

+0

スクリプトがちょうどファイル名を入力すると、かなり苦しいです! –

関連する問題