2009-04-06 6 views
6

Предположим, у вас есть скрипт на языке 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_profile не создаются.

ответ

4

Bad:

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

Почему это плохо? Из-за множества причин; прежде всего:

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

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

perl foo.pl > mytmpfile; bash mytmpfile 

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

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

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

perl foo.pl | bash 

Это довольно безопасно многоборье («безопасное» в контексте, наименее ошибка подверженная) Если предположить, что Perl выводит скрипт правильного синтаксиса Баша, конечно ,

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

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

bash <($ OUTPUT) - это то, что я искал. Это делает ОГРОМНОЕ различие с трубопроводом, поскольку вы все еще контролируете его - для входов. – yclian

3

Try:

foobar.pl | bash 
+0

экспорт FOO = 'foobar.pl '; $ FOO – ojblass

0

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

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

удачи!

5
`foobar.pl` 
+0

+1 для простоты. :) –

4

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

print "date"; 

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

> $(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 
+0

В случае $() команда «perl qq.pl» запускается в отдельной оболочке, но команда, возвращаемая им «date», запускается в текущей оболочке, которая, я думаю, он хотел. –

+0

Вы не должны использовать '.' Или 'source' для запуска команд. Вы никогда не знаете, что сценарий будет делать с вашей рабочей оболочкой; что означает, что вы не можете полагаться на то, что вы даже получите возможность правильно очистить файл temp. Это может помочь поместить очистку в ловушку на EXIT. – lhunath

+0

@ lhunath, вы не прочитали вопрос? Quoth the raven «не беспокойтесь о проблемах безопасности, поскольку это работает в надежной среде». Я воспринял это так, что контроль над скриптом Perl контролировался. И использование "." было специально для удовлетворения требования, чтобы он не начинал новый процесс. – paxdiablo

0

Try с открытым ($ ФХ "- |", $ arg1, $ arg2)

Смежные вопросы