从perl调用带反引号的find - find:写入错误:管道损坏

时间:2011-07-07 10:17:21

标签: perl unix scripting find

我从这样的perl脚本调用find:

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

如果我从shell执行它,我没有错误。此外,它将正确的值返回到$ one_file,但我在提示符下得到了这个:

find: write error: Broken pipe

为什么会这样?如何摆脱查找:写入错误:管道损坏消息?

3 个答案:

答案 0 :(得分:4)

这个“错误”是完全正常的,是可以预期的。

  • 您正在运行一个find命令,可以打印出(可能)多行输出。
  • 你将它输入head,在获得一行输入后退出。
  • find命令尝试将其剩余的行写入不再有人监听的管道(head已死)。
  • find会抛出错误。

如果您想摆脱错误,请执行以下操作:

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

这将保持从查找到终端的完全可预测的错误(因为反引号和管道都没有head触摸stderr,这是打印错误的地方。)

答案 1 :(得分:3)

为什么在反引号中使用findhead,当有perl方法来处理它时?即:

当你完全确定自己在做什么时,我只建议使用反引号,在我看来你不是。哎呀,你可以通过这样做来让你当前的尝试工作:

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

答案 2 :(得分:1)

你可以试试这个(虽然我没有设法使用你发布的代码重现你的错误信息,所以也许这个我的错误版本可能会给你一个错误信息......):

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

以下是我从测试运行中获得的一些示例输出:

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

HTH