2011-07-07 6 views
4

私はこのようなperlスクリプトから検索を呼び出しています:私はシェルからそれを実行した場合のperlからバッククォートで見つける呼び出す - 見つける:書き込みエラー:壊れたパイプ

 
    my $one_file = `find $search_dir -name "\*.$refinfilebase.search" -print | head -n 1`; 

、私はエラーを取得していません。また、$ one_fileに適切な値を返しますが、プロンプトで次のように表示されます。

なぜでしょうか?どのように私はこれを取り除くことができます見つける:書き込みエラー:壊れたパイプメッセージ?

+0

シェルから実行すると同じエラーが表示されますか? –

+0

編集:シェルから実行すると、エラーは表示されません。また、Perlから呼び出されたときに正しい値を返しますが、私はいつもエラープロンプトを表示します。 – 719016

+1

これは助けになるかもしれません:[一致するものが見つかりましたか?](http://unix.stackexchange.com/questions/13860/how-to-detect-whether-find-found-any-matches) ) 'head -n 1'の代わりに' -quit'を使う可能性があり、 'head'バッファがいっぱいになっていることに注意してください。 – Mike

答えて

1

(...私はあなたが投稿のコードを使用して、エラーメッセージを再現するために管理していなかったが、ので、おそらく私のこのエラーのないバージョンは、同様にあなたにエラーメッセージを与えるかもしれない)あなたはこれを試みることができる:

my $file = `find $search_dir -name "\*.ssf" -print -exec head -n 1 {} \\;`; 

ここで私がテストランから得たいくつかのサンプル出力です:

./tmp1.ssf 
HEADER PROTEIN         21-FEB-11  1PDB 

HTH

4

この「エラー」は完全に正常であると予想されます。

  • 多くの出力行を(おそらく)出力するfindコマンドを実行しています。
  • あなたはそれをheadに入力しています。これは1行の入力を受けた後に終了します。
  • findコマンドは、もうリッスンしないパイプに残りの行を書き込もうとします(headが死んでいます)。
  • findはエラーとなります。

エラーを取り除きたい場合は、単に実行します。

my $file = `find .... 2>/dev/null | head -n 1`; 

これはheadタッチにバッククォートやパイプでもないので、(自分の端末になってから発見から全く予測可能なエラーを維持しますエラーが出力されているstderr)。

+0

私の答えはあなたの実際の質問に答えていますが、@ TLPの答えは正しい方向を指しています。スクリプトで直接行うことができるのであれば、3つの余分なプロセス(shell、find、head)を生成する理由はありません。 '' $ refinfilebase = '";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mother''')を入力します。 – unpythonic

3

なぜあなたはそれを処理するためのperlの方法がある場合、findheadをバッククォートで使用していますか?すなわち:

あなたは何をしているかについての絶対的な確信しているとき、私は唯一のバッククォートを使用することをお勧めします、あなたにはないと私には思われます。あなたは、これを単に行うことであなたの現在の試みがうまくいくようにすることができます:

my @files = `find $search_dir -name "\*.$refinfilebase.search" -print` 
my $one_file = $files[0]; 
+0

は何ですか?可能な最も古いperlバージョンで動作するメソッド?ダイヤモンドオペレーター? – 719016

+0

@aviそのためには、新しい質問をする必要があります。私は自分自身opendirが好きです。 – TLP

+0

完了、ありがとうhttp://stackoverflow.com/questions/6614085/finding-many-thousands-of-files-in-a-directory-pattern-in-perl – 719016

関連する問題