заголовки shell-скрипт (#!/ bin / sh vs #!/ bin / csh)



почему все файлы скриптов начинаются с



#!/bin/sh


или



#!/bin/csh


это обязательно? С какой целью это делается? И в чем разница между ними?

770   3  

3 ответов:

Это называется Shebang:

http://en.wikipedia.org/wiki/Shebang_ (Unix)

#!переводчик [необязательного]

shebang имеет значение только тогда, когда скрипт имеет разрешение на выполнение (например, chmod u+x script.sh).

когда оболочка выполняет сценарий, она будет использовать указанный интерпретатор.

пример:

#!/bin/bash
# file: foo.sh
echo 1

$ chmod u+x foo.sh
$ ./foo.sh
  1

The #! строка сообщает ядру (в частности, в реализации execve системный вызов), что эта программа написана на интерпретируемом языке; абсолютный путь, который следует, идентифицирует интерпретатор. Программы, скомпилированные в машинный код, начинаются с другой последовательности байтов - на большинстве современных Unixes,7f 45 4c 46 (^?Эльф), что определяет их как таковые.

вы можете поставить абсолютный путь к любую программу хочу!--51--> после #!, пока эта программа сама по себе не является #! сценарий. Ядро перезаписывает вызов

./script arg1 arg2 arg3 ...

здесь ./script начинается с #! /usr/bin/perl, как будто командная строка на самом деле была

/usr/bin/perl ./script arg1 arg2 arg3

или, как вы видели, вы можете использовать #! /bin/sh написать сценарий, предназначенный для интерпретации sh.

The #! строка обрабатывается только если вы напрямую вызова скрипта (./script на командная строка); файл также должен быть исполняемым (chmod +x script). Если вы это сделаете sh ./script the #! строка не нужна (и будет проигнорирована, если присутствует), и файл не должен быть исполняемым. Элемент точка функция позволяет вам напрямую вызывать программы на интерпретируемом языке, не зная, на каком языке они написаны. (Делать grep '^#!' /usr/bin/* -- вы обнаружите, что очень многие фондовые программы На самом деле используют эту функцию.)

вот некоторые правила использования этой функции:

  • The #! должны быть самые первые два байт в файле. В частности, файл должны быть в кодировке, совместимой с ASCII (например, UTF-8 будет работать, но UTF-16 не будет) и не должен начните с "метки порядка байтов", иначе ядро не распознает ее как #! сценарий.
  • путь после #! должен быть абсолютный путь (начинается с /). Он не может содержать пространство, символы табуляции или новой строки.
  • это хороший стиль, но не требуется, чтобы поставить пробел между #! и /. Не ставьте там больше одного места.
  • вы не можете поместить переменные оболочки на #! линии, они не будут расширены.
  • можно поставить один аргумент командной строки после абсолютного пути, отделенный от него одним пробелом. Как и абсолютный путь, этот аргумент не может содержать символы пробела, табуляции или новой строки. Иногда это необходимо, чтобы заставить вещи работать (#! /usr/bin/awk -f), иногда это просто полезно (#! /usr/bin/perl -Tw). К сожалению, вы не можете поставить два или больше аргументов после абсолютного пути.
  • некоторые люди скажут вам, чтобы использовать #! /usr/bin/env interpreter вместо #! /absolute/path/to/interpreter. это почти всегда ошибка. это делает поведение вашей программы зависит от $PATH переменная пользователя, который вызывает скрипт. И не все системы имеют env в первом место.
  • программы, которые нужны setuid или setgid привилегии не можете использовать #!; они должны быть скомпилированы в машинный код. (Если вы не знаете, что setuid это, не волнуйтесь об этом.)

о csh, относится к sh примерно как Нутримат Продвинутый Заменитель Чая для чая. Он имеет (или, скорее, имел; современные реализации sh догнали) ряд преимуществ перед sh для интерактивного использования, но с использованием он (или его потомок tcsh) для сценариев почти всегда ошибка. Если вы новичок в скриптах оболочки в целом, я настоятельно рекомендую вам игнорировать его и сосредоточиться на sh. Если вы используете csh относительный как ваша оболочка входа, переключитесь на bash или zsh, так что интерактивный командный язык будет таким же, как язык сценариев, который вы изучаете.

это определяет, какую оболочку (интерпретатор команд) вы используете для интерпретации/запуска вашего скрипта. Каждая оболочка немного отличается тем, как она взаимодействует с пользователем и выполняет скрипты (программы).

когда вы вводите команду в командной строке Unix, вы взаимодействуете с оболочкой.

например,#!/bin/csh относится к C-оболочка, /bin/tcsh t-shell,/bin/bash интерпретатор bash и т. д.

вы можете сказать, какую интерактивную оболочку вы используете

 echo $SHELL
или
 env | grep -i shell

вы можете изменить свою командную оболочку с .

каждый из них имеет немного другой набор команд и способ назначения переменных и свой собственный набор программных конструкций. Например, оператор if-else с bash выглядит иначе, чем тот, что находится в C-shell.

на этой странице может представлять интерес, поскольку он "переводит" между bash и tcsh команды/синтаксис.

использование директивы в сценарии оболочки позволяет запускать программы с использованием другой оболочки. Например я использую tcsh shell в интерактивном режиме, но часто запускать сценарии bash с помощью /bin/bash в файле сценария.

в сторону:

эта концепция распространяется и на другие скрипты. Например, если вы программируете на Python вы бы поставил

 #!/usr/bin/python

в верхней части вашей программы на Python

Comments

    Ничего не найдено.