Введение
Первоначально, мы только один корпус с Unix. Когда команда побежала, корпуса будут пытаться ссылаться на одно из EXEC () системные вызовы на нем. Это команда является исполняемым в EXEC удастся, и команда будет идти. Если EXEC () не, на корпусе, не сдаваться, а он будет пытаться интерпретировать команду файла, как если бы это был скрипт. Это отлично работает до тех пор, пока существует только один корпус с системой. Но что, если вы используете одну оболочку в качестве интерактивных и хотите запустить скрипт, написанный на другой оболочке языка?
Это где #! Хитрость приходит дюйм Идея использования # представлять комментарий возникла с csh и быстро добавить в Bourne оболочки. Теперь все орудия знаю игнорировать вещи после #. Таким образом, мы можем добавить ведущей линии то вроде "#! / USR / BIN / KSH". Для корпуса этой линии просто комментарий. Но если ядро пытается выполнить файл с этой линии, она будет EXEC указанного переводчик и пройти сценарий к нему. Так скриптов стал исполняемого так же, как настоящие исполнимые файлы имеют. Теперь, когда оболочка пытается EXEC скрипт, это удается.
Что делать, если вы оставите у #! линию? Итак, ядро EXEC не удастся. Средняя оболочка будет пытаться запустить скрипт сам. Несколько снарядов попытается проверить скрипт, чтобы попытаться угадать язык. Это не хорошо. Вы можете быть запущена KSH качестве интерактивной оболочки и KSH написания скриптов. Если вы позже переключиться на Баш качестве интерактивной оболочки, некоторые ваши скрипты могут продолжать работать в то время как другие могут оказаться безуспешными. Также линия
это комментарий , что представляет собой важный ключ к программисту, который смотрит на скрипт, чтобы понять его. Зная, на каком языке автор пытается использовать это большая помощь.
Хотя я использовал термин "оболочка", на самом деле этот метод может быть использован со многими программами, которые не являются орудий. Вот "сценария", чтобы отобразить многострочном сообщения:
Код:
#! /usr/bin/cat
Line 1
Line 2
Line 3
Это покажет, что "#! / USR / BIN / кот" линии, но, кроме того, оно работает довольно хорошо.
Проходя аргумент
Вы можете сдать единый аргумент следующим образом:
#! / USR / местное / BIN /
Perl -W
Но, в общем, вы ограничены
один аргумент. На большинстве систем, в строку: "#! / Некоторые / переводчик-A-B" приведет к "-A-B" быть принят в качестве единого аргумента. Тем не менее, единственный аргумент, не только начиная с дефиса. Мы можем улучшить наше послание сценария:
Код:
#! /usr/bin/sed 1d
Line 1
Line 2
Line 3
Пример
Давайте все это вместе с примером. Вот
Perl Сценарий, который мне позвонит perlargs:
Код:
#! /usr/local/bin/perl -w
#! /usr/local/bin/perl -w
print "script name is ", $0, "\n";
while (@ARGV) {
$ARGV = shift @ARGV;
print "argument ", $i++, " is ", $ARGV, "\n";
}
system "ps -f -ww";
В-З спросит
Perl Вопрос предупреждающие сообщения. Скрипт просто выводит свои аргументы, а затем запускает PS команду. Когда я запускаю ее, я получаю:
Код:
$ ./perlargs one two three
Name "main::i" used only once: possible typo at ./perlargs line 10.
script name is ./perlargs
argument 0 is one
argument 1 is two
argument 2 is three
UID PID PPID STIME TTY TIME CMD
perderabo 69 1 17:47:28 n01 0:00.24 /bin/ksh -l
perderabo 201 69 18:28:22 n01 0:00.03 /usr/local/bin/perl -w ./perlargs one two three
perderabo 2055 201 18:28:22 n01 0:00.01 ps -f -ww
$
Отметим, что
Perl Процесс открывается с 5 аргументов. 2-й аргумент является именем скрипта. Это до
Perl процесс представить окончательный 3 аргументов в качестве аргумента список рассматривается сценарий. Кроме того, реализовать ядра начали
Perl процесса. После этого, он до
Perl Чтобы открыть сценарий и читать его и выполнить каждую строку. Поэтому сценарии должны быть читаемыми. Вы не можете выполнить, не читаем сценарий.
Заключение
Это должно быть достаточно информации, чтобы понять, что происходит с теми, #! линий. В следующие должности, я буду добавлять информацию о различных аспектах этого процесса.