запустить вывод скрипта как отдельную команду bash

StackOverflow https://stackoverflow.com/questions/720122

Вопрос

предположим, что у вас есть Perl-скрипт "foobar.pl", который выводит на стандартный вывод следующее:

date -R

и вы хотите запустить все, что выводит этот сценарий Perl, как отдельную команду bash (не беспокойтесь о проблемах безопасности, поскольку это выполняется в доверенной среде).

Как заставить bash распознавать это как отдельную команду?

Я пробовал использовать xargs, но, похоже, это пройдет. только аргументы на заранее определенную команду.

Я хочу, чтобы Perl-скрипт мог выводить любую произвольную команду.

$command = 'date -R'
system($command); ## in the perl script 

вышеизложенное не работает, потому что я хочу, чтобы оно работало в существующей среде cygwin...

foobar.pl | xargs bash -i {}

вышеизложенное не работает, потому что bash, похоже, запускает новый процесс, и поэтому инициализация и настройки из bash_profile не создаются.

Это было полезно?

Решение

Плохой:

`perl foo.pl`
$(perl foo.pl)

Почему это плохо?По очень многим причинам;особенно:

  • Разделение слов:Здесь вы берете выходные данные Perl-скрипта, разделяете их на фрагменты, где есть пробелы, табуляции или символы новой строки, и принимаете эти фрагменты в качестве аргументов для первого фрагмента, который является командой для запуска.В действительно чрезвычайно упрощенных случаях, таких как $(echo 'date +%s') это может сработать;но это просто очень плохое представление того, что вы ДЕЙСТВИТЕЛЬНО здесь делаете.
  • Вы не можете цитировать или использовать какие-либо другие bash функции оболочки, такие как расширение параметров, ключевые слова bash и т. д.

Хорошо, но неудобно:

perl foo.pl > mytmpfile; bash mytmpfile

Создание временного файла для помещения в него результатов вашего Perl-скрипта и последующий запуск его с помощью bash работает, но это неудобно, поскольку вам нужно создать (и очистить!) временный файл и разместить его в портативном для записи (и безопасном!) месте.

Также помните, что не следует использовать . или source для выполнения временного файла, если вы действительно не собираетесь запускать его в активной оболочке.Более того, когда вы используете . или source, после этого вы не сможете надежно очистить временный файл.

Вероятно, лучшее решение:

perl foo.pl | bash

Это довольно безопасно во всех отношениях («безопасно» в контексте и наименее подвержено ошибкам), если, конечно, ваш perl-скрипт выводит правильный синтаксис bash.

Альтернативы, которые делают практически то же самое:

bash < <(perl foo.pl)
bash <(perl foo.pl)

Другие советы

`foobar.pl`

Учитывая файл Perl:

print "date";

следующая команда bash сделает это.

> $(perl qq.pl)
Mon Apr  6 11:02:07 WAST 2009

Но это запускается в отдельной оболочке.Если вы действительно хотите вызвать его в контексте текущий оболочка, сделай это:

$ perl qq.pl >/tmp/qq.$$ ; . /tmp/qq.$$ ; rm -f /tmp/qq.$$
Mon Apr  6 11:04:59 WAST 2009

Пытаться:

foobar.pl | bash

Я не думаю, что это именно то, что вы ищете, но это то, что у меня есть :-)

perl foo.pl > /tmp/$$.script; bash /tmp/$$.script; rm /tmp/$$.script

Удачи!

Попробуйте open($fh,"-|",$arg1,$arg2)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top