2017-01-25 5 views
1

У меня есть скрипт functions.sh с кучей глобальных функций, которые я хочу использовать в других скриптах. этот скрипт функций написан в bash (#!/bin/bash)UNIX/solaris shell script shebang in include file

Эти много сценариев были написаны на протяжении многих лет, поэтому старые или с #!/bin/sh (что отличается от #!/bin/bash в солярии).

Мой вопрос здесь, когда вы вызываете файл functions.sh (с. /path/to/functions.sh) из сценария sh (не bash), является линией shebang из функции «functions.sh» ?

Вкратце, можете ли вы назвать скрипт скрипта bash из другого сценария типа оболочки (с соответствующими линиями shebang в обоих)?

Спасибо!

ответ

3

До тех пор, как вы хотите использовать функцию, которую нужно источник скрипты и не выполнить это

source /path/to/functions.sh 

или в соответствии с POSIX стандартами, сделать

. ./path/to/functions.sh 

из в сценарии sh, что эквивалентно включению содержимого функции.sh в файл в том месте, где выполняется команда.

Вам нужно понять разницу между поиском и выполнением сценария.

  • Sourcing запускает сценарий из родительской оболочки, в которой скрипт вызывается; все переменные окружения, функции сохраняются до тех пор, родитель-оболочка не прекращаются (терминал закрыт или переменные сбрасываются или отключенные),

  • Выполнить Forks новую оболочку из родительской оболочки и те, переменные, функции , в том числе ваши экспортные переменные, сохраняются только в среде под-оболочки и уничтожаются в конце завершения сценария.

+1

Спасибо Иниан, просто попробовал использовать «источник», и теперь он работает как шарм. Я не полностью понял разницу между поиском и исполнением! – seb

+0

@seb: Приятно помочь! – Inian

+0

FYI, 'источник' - это багизм. Для совместимости с POSIX sh это должно быть '.' - см. Спецификацию в http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html # tag_18_18 –

1

Когда источник файла, то притон в этом файле игнорируется (не на первой линии, поскольку она включена в сценарий вызывающего абонента и рассматривается как комментарий). Когда вы включаете старый сценарий с #!/bin/sh, он будет обрабатываться как оболочка вызывающего. Большинство вещей, написанных в /bin/sh, будут работать в bash.
Когда вы запускаете скрипт sh или ksh, и вы включаете (source) файл bash, каждый конкретный код bash даст проблемы.