我从这样的perl脚本调用find:
my $one_file = `find $search_dir -name "\*.$refinfilebase.search" -print | head -n 1`;
如果我从shell执行它,我没有错误。此外,它将正确的值返回到$ one_file,但我在提示符下得到了这个:
find: write error: Broken pipe
为什么会这样?如何摆脱查找:写入错误:管道损坏消息?
答案 0 :(得分:4)
这个“错误”是完全正常的,是可以预期的。
head
,在获得一行输入后退出。find
命令尝试将其剩余的行写入不再有人监听的管道(head
已死)。find
会抛出错误。如果您想摆脱错误,请执行以下操作:
my $file = `find .... 2>/dev/null | head -n 1`;
这将保持从查找到终端的完全可预测的错误(因为反引号和管道都没有head
触摸stderr,这是打印错误的地方。)
答案 1 :(得分:3)
为什么在反引号中使用find
和head
,当有perl方法来处理它时?即:
my @files =
<$refinfilebase.search>
当你完全确定自己在做什么时,我只建议使用反引号,在我看来你不是。哎呀,你可以通过这样做来让你当前的尝试工作:
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