Нит выбирает:
- Ваши «шебанги» не правы - они должны начинаться
#!
. - На самом деле вам не нужен «шебанг» в файле, который предназначен для поиска. Возможно, вы захотите отключить его, чтобы было ясно, что файл предназначен для использования и не запускается как обычный скрипт. (В частности, вы, вероятно, должны начать это с комментария, который говорит что-то вроде
# This file is meant to be sourced and not run as an ordinary script.
) - Строго говоря, вам не нужен «шебанг» в файле, который должен быть запущен, хотя это не повредит.
bash scriptname
- Конечно ты получаешь
PrintDate: command not found
. Вашmain.script.sh
файл не является определяющимPrintDate
; это определяетPritnDate
.
Но реальный ответ на ваш вопрос:
- Весь смысл в
source
том, что исходный скрипт читается и интерпретируется в текущем основном процессе оболочки, но когда вы делаете его частью конвейера, вы заставляете его запускаться в дочернем процессе. Хитрость заключается в создании трубы без создания конвейера. Хитрость для этого заключается в использовании подстановки процессов (расширение bash для подстановки команд ). Эта команда:
source main.script.sh > >(dialog --progressbox "sourcing please wait..." 20 80)
создаст дочерний процесс для запуска
dialog
программы и создаст канал из основного процесса оболочки в этот дочерний процесс, но затем он сделает этот канал похожим на обычный файл и отправит выводsource
команды в канал при его создании похоже на обычное перенаправление стандартного вывода. Следовательно,source
выполняется в основном процессе оболочки (в данном случае этоbash
процесс, выполняющийjob1.sh
сценарий), и поэтому ваши функции определены вjob1.sh
сценарии.