Рейтинг:-1

в perl команда "система", используя косвенный объект, перенаправление не работает, нужна помощь

флаг ws

Я использую Кубунту 20.04. Perl-версия показывается perl -v как

perl 5, версия 30, subversion 0 (v5.30.0), созданный для x86_64-linux-gnu-thread-multi (с 50 зарегистрированными исправлениями, см. perl -V

Я только что сделал обновление apt-get, и с помощью менеджера пакетов Muon я обновил все установленные пакеты perl.

Но после этого perl 5 как и раньше, perl 6 у меня не появился.

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

perl -we 'system("echo \"aaa\" > /tmp/WEx_args_file"); '

В этом случае файл записывается.

Но при использовании косвенного объекта, например

perl -we ' @WE_args = ("echo", " \"qqq\" > /tmp/WEx_args_file" ); $WE_retcod_system = система { $WE_args[0] } @WE_args; print "WE_retcod_system: ~", $WE_retcod_system, "~\n"; if($WE_retcod_system != 0) { die "\nsystem >>>YYY>>>@WE_args<<<YYY<<< не удалось: $?"; }; '

в этом случае файл не записывается.

Отображаемый вывод находится на экране:

"qqq" > /tmp/WEx_args_file

затем следует

WE_retcode_system: ~0~

Целый день я пробовал косвенный объект во многих вариациях. Я не нашел код, который нужно записать в файл tmp.

Пожалуйста, кто-нибудь знает решение?

=====

Пытаясь продолжить, я нашел очень хороший

IPC::Система::Простой

С помощью этого я намерен заменить мой код обратной кавычки

эхо -n "qqq" | ххд -g1

с функцией захвата, например

perl -мы используем IPC::System::Simple qw/capturex/; открыть(FHo, ">/tmp/Wex_args_file") или умереть; $WE_got_from_cpx = capturex("echo", "-n", ""qqq"", "|", "xxd -g1" ); print FHo "WE_got_from_cpx: ~", $WE_got_from_cpx, "~\n"; '

Насколько я понял, это правильное использование Capturex. Но новая проблема, это не работает.

Команда на правой стороне трубы, т.е.

ххд -g1

не выполняется, а только копируется. Результат

WE_got_from_cpx: ~"qqq" | ххд -g1~

Я боюсь, что эти модули в IPC::System::Simple основаны на ведущей точке, такой как «косвенный объект», так как только первый аргумент является выполняемой командой.

Как я могу использовать IPC::System::Simple, чтобы запустить всю функцию обратной кавычки?

С уважением Антон

muru avatar
флаг us
Почему вы передали `echo` в качестве аргумента отдельно, а `"qqq" > /tmp/WEx_args_file` объединили в один аргумент?
Anton Wessel avatar
флаг ws
Рекомендуемый, так называемый «косвенный объектный» способ подразумевает, что исполняемая команда записывается в таком формате: must b
Anton Wessel avatar
флаг ws
Рекомендуемый, так называемый "косвенный объектный" способ подразумевает, что выполняемая команда записывается в таком формате: должна быть как предшественница перед списком, следует список команды "системный список". Все промежуточные записи не работают, за исключением случаев, когда я сведен к моему первому случаю просто system()..
raj avatar
флаг cn
raj
Используя непрямой синтаксис объекта, вы передаете `"qqq" > /tmp/WEx_args_file` в качестве строки аргумента команде `echo`, поэтому неудивительно, что команда выводит именно это. В простой версии аргументом является только `\"aaa\"`. Перенаправление (`> /tmp/WEx_args_file`) **не** является частью строки аргумента; он обрабатывается оболочкой до того, как аргументы передаются команде. Вам нужно найти способ обработки перенаправления с использованием косвенного синтаксиса объекта; это может быть сложно, если вообще возможно, вероятно, потребует некоторых операций с файловыми дескрипторами. Я предлагаю спросить об этом на StackOverflow.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.