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

340
Asaf Magen

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

1 ответ на вопрос

1
G-Man

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

  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сценарии.

я исправил в соответствии с вашими замечаниями. это была просто опечатка с моей стороны, и спасибо, что работает для меня! Asaf Magen 7 лет назад 0