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

1

Нит выбирает:

  1. Ваши «шебанги» не правы - они должны начинаться с #! ,
  2. На самом деле вам не нужен «шебанг» в файле, который предназначен для поиска.  Возможно, вы захотите отключить его, чтобы было ясно, что файл предназначен для использования и не запускается как обычный скрипт.  (В частности, вы, вероятно, должны начать это с комментария, который говорит что-то вроде
    # This file is meant to be sourced and not run as an ordinary script.)
  3. Строго говоря, вам не нужен «шебанг» в файле, который должен запускаться bash scriptname , хотя это не повредит.
  4. Конечно, вы получаете PrintDate: command not found .  Ваш файл main.script.sh не определяет PrintDate ; это определяет PritnDate .

Но реальный ответ на ваш вопрос:

  1. Суть source том, что исходный скрипт читается и интерпретируется в текущем основном процессе оболочки, но когда вы делаете его частью конвейера, вы заставляете его запускаться в дочернем процессе.
  2. Хитрость заключается в создании трубы без создания конвейера.  Хитрость для этого заключается в использовании подстановки процессов (расширение bash для подстановки команд).  Эта команда:

    source main.script.sh > >(dialog --progressbox "sourcing please wait..." 20 80)
    

    создаст дочерний процесс для запуска dialog программы и создаст канал из основного процесса оболочки в этот дочерний процесс, но затем он сделает этот канал похожим на обычный файл и отправит вывод source команды в канал, пока сделать его похожим на обычное перенаправление стандартного вывода.  Следовательно, source запускается в основном процессе оболочки (в данном случае это процесс bash , в котором выполняется сценарий job1.sh), и поэтому ваши функции определены в сценарии job1.sh

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .