Используя исходную команду с диалогом
Я пытаюсь найти большой скрипт со многими функциями, которые занимают некоторое время. Я хотел бы представить диалог "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
скрипт.