запустить вывод скрипта как отдельную команду bash - PullRequest
6 голосов
/ 06 апреля 2009

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

Ответы [ 6 ]

5 голосов
/ 06 апреля 2009
`foobar.pl`
4 голосов
/ 06 апреля 2009

Bad:

`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)
4 голосов
/ 06 апреля 2009

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

print "date";

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

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

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

$ perl qq.pl >/tmp/qq.$$ ; . /tmp/qq.$$ ; rm -f /tmp/qq.$$
Mon Apr  6 11:04:59 WAST 2009
3 голосов
/ 06 апреля 2009

Попробуйте:

foobar.pl | bash
0 голосов
/ 05 мая 2009

Попробуйте с открытым ($ fh, "- |", $ arg1, $ arg2)

0 голосов
/ 06 апреля 2009

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

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

Удачи!

...