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