вызов find с обратными галочками из perl - find: ошибка записи: сломанный канал - PullRequest
4 голосов
/ 07 июля 2011

Я звоню find из сценария Perl, как это:

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

Если я выполню его из оболочки, я не получу ошибку. Кроме того, он возвращает правильное значение в $ one_file, но я получаю это в приглашении:

find: write error: Broken pipe

С чего бы это? Как мне избавиться от этой находки: ошибка записи: Сломанный канал сообщение?

Ответы [ 3 ]

4 голосов
/ 07 июля 2011

Эта «ошибка» совершенно нормальна и ее следовало ожидать.

  • Вы запускаете команду поиска, которая выводит (потенциально) много строк вывода.
  • Вы вводите это в head, который завершает работу после получения одной строки ввода.
  • Команда find пытается записать оставшиеся строки в канал, который больше никого не слушает (head мертв).
  • find выдаст ошибку.

Если вы хотите избавиться от ошибки, просто сделайте:

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

Это предотвратит попадание на ваш терминал совершенно предсказуемой ошибки при поиске (поскольку ни backticks, ни канал в head touch stderr, где и печатается эта ошибка).

3 голосов
/ 07 июля 2011

Почему вы используете find и head в обратных кавычках, когда есть Perl способы справиться с этим?Т.е.:

Я бы рекомендовал использовать обратные пометки, только когда вы абсолютно уверены в том, что делаете, и мне кажется, чтоты не.Черт возьми, вы можете заставить свою текущую попытку работать, просто сделав это:

my @files = `find $search_dir -name "\*.$refinfilebase.search" -print`
my $one_file = $files[0];
1 голос
/ 07 июля 2011

Вы можете попробовать это (хотя мне не удалось воспроизвести ваше сообщение об ошибке, используя код, который вы разместили, поэтому, возможно, эта моя безошибочная версия может также дать вам сообщение об ошибке ...):

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

Вот пример выходных данных, которые я получил от тестового прогона:

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

НТН

...