Назначение сценариев переменным для сценария оболочки - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь назначить сценарии bash переменным для использования в сценарии-обертке, но все попытки, которые я пробовал, приводили к ошибке «Нет такого файла или каталога»:

#!/bin/bash 
textgen=$(< textcreator.sh)
tablegen=$(< tablecreator.sh)
htmlgen=$(< webcreator.sh)


 exec $textproces
 if [[ $textproces -eq 0 ]]
    then
        echo "Text Processing has ran successfully"
        exec $listgen
        if [[ $listgen -eq 0 ]]
          then
              echo "List Generation has ran successfully"
              exec $pagegen
              if [[ $pagegen -eq 0 ]]
                then
                    echo "HTML Page Generation has ran successfully"
                    echo "The command wrapper has finished successfully"
                    exit 0
                else
                  echo "Error: HTML Page Generation was unsuccessful"
                  exit 1
              fi
          else
             echo "Error: Text Processing was unsuccessful"
             exit 1
        fi
    else
        echo "Error: Text Processing was unsuccessful"
        exit 1
 fi

Методы, которые япопробовал: имя файла кошки, экспорт, источник и стандартное назначение.Идея состоит в том, что он должен работать без указания пути, все эти оболочки в любом случае находятся в одном каталоге.Мы очень ценим любую помощь!

ПРИМЕЧАНИЕ: я знаю, что это ужасно, но я думал о том, как сделать это с заявлениями IF

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Есть несколько серьезных проблем с кодом в вопросе.Некоторые идентифицируются как Shellcheck .Всегда запускайте Shellcheck для нового и измененного кода.

Проблемы включают:

  1. Переменные, назначенные при запуске, не являются переменными, которые используются позже.
  2. Переменныеустанавливаются на содержание программ, а не имена файлов, содержащих программы.(Единственный способ использовать содержимое - это передать их eval. Это было бы не хорошей идеей.)
  3. exec используется для запуска программ,exec заменяет текущую программу новой программой, определенной ее аргументами.Это примерно эквивалентно запуску другой программы и немедленному завершению работы.После использования exec код после него в программе не выполняется.
  4. Пути к программам, которые должны быть запущены, не указываются.Поскольку программы находятся в текущем каталоге (.), а . обычно отсутствует в PATH (по очень веским причинам), оболочка выдаст ошибки «команда не найдена» для попыток их запуска.
  5. Код пытается получить статус выхода из программ, проверяя значение переменной, содержащей имя программы.Статус выхода из программы можно получить с помощью встроенной переменной $?.Однако самый простой способ проверить, не выполнила ли команда команду, - это использовать ее непосредственно в чистом коде Shellcheck , указанном ниже, if.

и попытаться устранить проблемы.Он также устраняет вложенные операторы if в попытке сделать код более понятным.

#!/bin/bash

textgen=textcreator.sh
listgen=tablecreator.sh
pagegen=webcreator.sh

if ! "./$textgen" ; then
    echo "Error: Text Processing was unsuccessful"
    exit 1
fi

echo "Text Processing has ran successfully"

if ! "./$listgen" ; then
    echo "Error: List Generation was unsuccessful"
    exit 1
fi

echo "List Generation has ran successfully"

if ! "./$pagegen" ; then
    echo "Error: HTML Page Generation was unsuccessful"
    exit 1
fi

echo "HTML Page Generation has ran successfully"
echo "The command wrapper has finished successfully"

exit 0

Код можно использовать другими различными способами (например, отправлять вывод ошибок в стандартный eror (... >&2),уменьшите дублирование, используя функцию для вывода сообщения об ошибке и выхода из программы).

0 голосов
/ 26 ноября 2018

На самом деле это зависит от того, в каком каталоге вы находились, когда выполняли корневой скрипт.Так что их нахождение в одном каталоге не помогает.Вы можете cd войти в каталог, содержащий вложенные сценарии, прежде чем выполнять их из корневого сценария.

...