Используя исходную команду с диалогом

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

Другие вопросы по тегам