Perl сортировать временный каталог - PullRequest
0 голосов
/ 10 августа 2010

Я столкнулся с проблемами с пространством на моей машине, и поэтому команда sort в unix не удалась из-за недостатка места в / tmp.Чтобы обойти это, я решил запустить сортировку с опцией -T, позволяющей использовать другой каталог для создания временных файлов.Вот сценарий Perl, который у меня есть

   my $TMPDIR              = "/home/xyz/workspace/";
    my $sortCommand         = "awk 'NR == 1; NR > 1 { print \$0 | \"sort -T \$TMPDIR -k1,1\" }' test > test.sort";
    system_call($sortCommand, "Sort");
    sub system_call {
      .......
}

, он отлично работает на моем рабочем столе, но когда я запускаю его на другом компьютере, я получаю ошибку

"sort: не удается создать временный файл: -k1,1 / sortFoeXZx: Нет такого файла или каталога "

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 10 августа 2010

Здесь у вас есть четыре уровня интерпретации (perl, shell, awk, shell). Команда сортировки оболочки:

awk 'NR == 1; NR > 1 { print $0 | "sort -T $TMPDIR -k1,1" }' test > test.sort

так $TMPDIR расширяется внутренней оболочкой. Очевидно, на вашем настольном компьютере есть переменная окружения с таким именем, но не на другом. Лучшее решение - сделать TMPDIR переменной среды и правильно заключить ее в кавычки (расширение ее из Perl вызовет проблемы, если ее значение содержит символы, которые должны быть защищены от расширения awk или оболочки).

$ENV{TMPDIR} = "/home/xyz/workspace/";
my $sortCommand = "awk 'NR == 1; NR > 1 { print \$0 | \"sort -T \\\"\$TMPDIR\\\" -k1,1\" }' test > test.sort";

Странно так сильно полагаться на внешние инструменты из Perl-программы. Хорошо, если sort переполняет /tmp, тогда встроенному в Perl sort, скорее всего, не хватит памяти. Так что используйте Sort :: External .

0 голосов
/ 10 августа 2010

FWIW, вы можете использовать часть своего кода с помощью File :: Tempdir , что позволит вам создать временный каталог или файл с соответствующими разрешениями пользователя, независимо от среды, в которой вы находитесь.

use File::Temp 'tempdir';
my $tempdir = tempdir(CLEANUP => 1);
my $sortCommand         = "awk 'NR == 1; NR > 1 { print \$0 | \"sort -T $tempdir -k1,1\" }' test > test.sort";
system_call($sortCommand, "Sort");
0 голосов
/ 10 августа 2010

Вы экранировали $ до переменной TMPDIR, что привело к пропуску $TMPDIR в оболочку. Поскольку это не определено в вашей среде, команда заканчивается следующим образом:

sort -T \ -k1,1

Это непреднамеренно вышло за пределы следующего пробела, что привело к вашей ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...