Используя исходную команду с диалогом
Я пытаюсь найти большой скрипт со многими функциями, которые занимают некоторое время. Я хотел бы представить диалог "Sourcing Please Подождите..." в то же время. Как только я закончу поиск, я хочу использовать свои функции. но использование диалогового окна, кажется, отменяет скисание. источник работает с диалогом, но функция не запускается.
файл: main.script.sh
#!/bin/bash
long task...
function PrintDate(){
date
}
файл: job1.sh
#!/bin/bash
source main.script.sh | dialog --progressbox "sourcing please wait..." 20 80
PrintDate
командная строка:
bash job1.sh
вывод я получаю
PrintDate: command not found
1 ответ
Нит выбирает:
- Ваши "шебанги" не правы - они должны начинаться
#!, - Вам на самом деле не нужен "шебанг" в файле, который предназначен для поиска. Возможно, вы захотите оставить это, чтобы было ясно, что файл предназначен для использования и не запускается как обычный скрипт.
(В частности, вы, вероятно, должны начать с комментария, который говорит что-то вроде
# 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скрипт.