Я не уверен в деталях вашего проекта, поэтому я полагаю, что вам нужен однострочный Perl для использования переменных оболочки, которые видны в области, в которой он называется.
A perl -e'...'
выполняет программу Perl , заданную в ''
. Чтобы любые переменные из среды, в которой запускается эта программа - конвейер или сценарий оболочки - были доступны программе, их значения должны быть переданы ей. Способы сделать это с одной строкой изложены в в этом посте , и вот резюме.
Программа Perl получает аргументы, переданные ей в командной строке в массиве @ARGV
. Таким образом, вы можете вызвать его в конвейере как
... | perl -e'($v1, $v2) = @ARGV; ...' "$0" "$1"
или как
... | xargs -l perl -e'($v1, $v2) = @ARGV; ...'
, если xargs
действительно используется для подачи программы Perl на вход. В первом примере переменные заключаются в кавычки для защиты возможных интересных символов в них (пробелы, *
и т. Д.) От интерпретации оболочкой, которая устанавливает и запускает perl-программу.
Если ввод содержит несколько строк для обработки и однострочник использует для него -n
или -p
, то распаковываете аргументы в BEGIN
блоке
... | perl -ne'BEGIN { ($v1, $v2) = splice(@ARGV,0,2) }; ...' "$0" "$1" ...
, который выполняется во время компиляции, поэтому перед циклом на входных строках предоставляется -n
/ -p
. Аргументы, отличные от имен файлов, теперь удаляются из @ARGV
, поэтому оставьте там только имена файлов для -n
/ -p
, на случай, если ввод поступит из файлов.
Существует также элементарный механизм для переключателей командной строки в однострочном режиме через переключатель -s . Пожалуйста, смотрите ссылку выше для деталей; Я бы порекомендовал @ARGV
над этим.
Наконец, ваш код вызова может установить переменные окружения , которые затем будут доступны программе Perl в %ENV
. Однако это не похоже на то, что вы хотите.
Также см. этот пост для другого примера.