2016-05-11 4 views
1

Если я включил файл конфигурации (переменные в сценарии оболочки) или файл библиотеки (имеет общие определения функций) в моем основном скрипте (который имеет shebang), то мне также нужен shebang для этого сценария оболочки конфигурации?Требуется ли shebang для сценариев конфигурации или библиотеки?

Редактировать: Я включаю файл конфигурации, используя. или источник Основной файл содержит #!/bin/sh shebang.

+0

Как вы вызываете скрипт conf из основного сценария? – heemayl

+0

@heemayl check the edit – Patrick

ответ

5

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

Из вашего описания, тогда вы «находите» файлы, поэтому нет, #! будет просто комментарием. Также может быть разумным удалить доступ к выполнению из этих файлов, чтобы они не были непреднамеренно названы дочерними процессами.

(если они не «источников», то определение будет происходить только в дочернем процессе и было бы бесполезно)

EDIT следующий @triplee комментарий:

Они могут быть вызваны в качестве дочернего процесса с использованием (например) sh filename, bash filename, или даже (вздрагивать) csh filename. Все эти оболочки имеют отличия, поэтому одно преимущество линии #! - это комментарий, указывающий, для какого типа оболочки указан код. Я бы не использовал его для этого, потому что он также подразумевает, что он может быть запущен как ребенок. Я уверен, что вы уже достаточно прокомментируете свой код, но, возможно, стоит добавить комментарии, чтобы указать оболочку.

+1

Кроме того, если вы всегда явно вызываете скрипт с помощью 'sh script' или' bash script', то shebang явно игнорируется. Возможно, также отметим, что они разные; 'sh' имеет другое поведение, даже если это символическая ссылка на' bash'. – tripleee

+0

@ tripleee: спасибо за предложение – cdarke

+0

@ tripleee, как оно отличается от поведения при символической привязке? – 123

0

#! с переводчиком, скажем, баш, не следует использовать:

  1. Если вы хотите использовать существующие переменные среды без его экспорта.
  2. Если вы хотите включить файл конфигурации для родительского сценария (используйте source или . вместо)

притон делает интерпретатор выполнить скрипт, который содержал сам (механизм начальной загрузки) хижину и во время этого исполнения , линия с shebang просто считается комментарием.

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