Это положительно древняя версия 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()
для всего этого.чтобы закончить, учитывая, что существует более одного дочернего процесса, потому что вы открыли канал.