Как исправить ошибку «Слишком длинная командная строка», если я хочу получить вывод команды? - PullRequest
0 голосов
/ 03 мая 2019

У меня есть код perl с очень длинной командой, и я хочу напечатать вывод в файл журнала.Это выглядит так:

system ( "$cmd  | tee -a $log_file" );

Когда я запускаю скрипт Perl, системный вызов выдает «Слишком длинная командная строка».

Если я запускаю системный вызов без конвейера, онработает.

Итак, мои вопросы:

  1. Есть ли ограничение символов для конвейера?
  2. Как я могу решить проблему?

Некоторые дополнительные сведения:

Команда $cmd имеет длину 8532. Я использую Perl версии 5.003_07 (да, я знаю, что она старая. Моя компания является ее владельцем.).

1 Ответ

1 голос
/ 03 мая 2019

Это положительно древняя версия Perl.Первый, который я использовал, был 5.004 в середине 90-х.Конечно, все могло измениться, но я думаю, что следующая цитата из документации system() по-прежнему актуальна.

Если есть только один скалярный аргумент, аргумент проверяется на наличие метасимволов оболочки, иесли они есть, весь аргумент передается в системную командную оболочку для анализа (это «/ bin / sh -c» на платформах Unix, но отличается на других платформах).Если в аргументе нет метасимволов оболочки, он разбивается на слова и передается непосредственно в execvp, что более эффективно.

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

Вы можете обойти это, временно повторно открыв STDOUT как «| tee -a $ log_file», а затем просто выполнивsystem($cmd).Я не осмелюсь рассказать вам, как именно это сделать (особенно если вы хотите вернуть свой старый STDOUT впоследствии) в такой древней версии Perl, потому что это наверняка со временем изменилось.Вам нужно будет обратиться к имеющейся документации.

Одна из возможностей - fork(), затем в дочернем процессе open STDOUT, "| tee -a $log_file" и exec($cmd) и в родительском процессе wait() для всего этого.чтобы закончить, учитывая, что существует более одного дочернего процесса, потому что вы открыли канал.

...