Назначение сценариев переменным для сценария оболочки

Я пытаюсь назначить сценарии 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

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

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

2 ответа

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

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

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

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

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

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