Выполнение кода Perl внутри сценария оболочки с помощью eval - PullRequest
1 голос
/ 10 октября 2011

Я наткнулся на следующий пример. Я попытался Google, но не смог найти много, поэтому я отправляю этот вопрос здесь.

  1. Какая польза от выполнения сценария Perl, подобного этому?
  2. Как мы можем заставить сценарий оболочки работать как "нормальный" сценарий оболочки после выполнения кода perl?

Вот код:

#!/bin/ksh
#! -*- perl -*-
eval 'exec $PERLLOCATION/bin/perl -x $0 ${1+"$@"} ;'
if 0;

print "hello world\n";
# how can I make it behave like a "normal" shell script from this point onwards? What needs to be done?
# echo "hello world" ### this results in error

Ответы [ 3 ]

5 голосов
/ 10 октября 2011

Эта идиома описана в документации perlrun.Переключатель -x сканирует весь файл и игнорирует все, что появляется перед первой строкой, которая начинается с #!, а также содержит слово perl.Это означает, что ваша система будет запускать сценарий с интерпретатором Perl независимо от того, вызываете ли вы сценарий с помощью perl или с помощью команды оболочки (sh/bash/ksh/ и т. Д.), То есть

$ perl this_script

и

$ sh this_script

запустит сценарий с perl.

Чтобы ответить на ваш второй вопрос, эта идиома не имеет ничего общего с объединением сценария оболочки и сценария Perl в одном файле.Есть несколько разных способов решения этой проблемы, но, возможно, самый читаемый способ - это написать в сценарии оболочки, но использовать нотацию heredoc оболочки для вызова кода Perl.

#!/bin/bash
# this is a bash script, but there is some Perl in here too

echo this line is printed from the shell
echo now let\'s run some Perl

perl <<EOF
# this is now perl script until we get to the EOF
print "This line is printed from Perl\n";
EOF

echo now this is from the shell script again
2 голосов
/ 10 октября 2011

Это намного проще, чем то, что уже было опубликовано.

#!$PERLLOCATION/bin/perl

не работает, потому что строка shebang (#!) интерпретируется ядром (а не оболочкой), а ядро ​​не 't выполнять интерполяцию переменных.

Код вызывает ksh для расширения переменной среды и запуска указанной установки Perl.

1 голос
/ 10 октября 2011

1. Если вы запускаете Perl-скрипт обычным способом:

#!/usr/bin/perl
print "hello world\n";

строка #! будет работать только в том случае, если интерпретатор Perl фактически установлен в /usr/bin. Двуязычный скрипт perl / ksh, который вы показываете, представляет собой хитрый способ заставить скрипт работать, даже если perl установлен где-то еще. Для получения дополнительной информации см., Например, http://alumnus.caltech.edu/~svhwan/prodScript/invokingPerl.html

2. Вы не можете. Когда процесс оболочки встречает команду exec, он завершается и передает управление perl. (Технически, выполняет perl вместо оболочки, не создавая новый процесс .) Единственный способ выполнить больше команд оболочки после этого - запустить новую оболочку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...