Назначение сценариев переменным для сценария оболочки
Я пытаюсь назначить сценарии 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 для нового и измененного кода.
Проблемы включают в себя:
- Переменные, назначенные в начале, не являются переменными, которые используются позже.
- Переменные устанавливаются на содержание программ, а не на имена файлов, содержащих программы. (Единственный способ использовать содержимое - передать их
eval
, Это не было бы хорошей идеей.) exec
используется для запуска программ.exec
заменяет текущую программу новой программой, определенной ее аргументами. Это примерно эквивалентно запуску другой программы и немедленному завершению работы. однаждыexec
был использован, код после него в программе не выполняется.- Пути к программам для запуска не указываются. Поскольку программы находятся в текущем каталоге (
.
), а также.
обычно не вPATH
(по очень веским причинам) оболочка выдаст ошибки "команда не найдена" при попытках их запуска. - Код пытается получить статус выхода из программ, проверяя значение переменной, содержащей имя программы. Статус выхода из программы можно получить через
$?
встроенная переменная. Однако самый простой способ проверить, не завершилась ли команда, - это использовать ее непосредственно в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
), уменьшите дублирование, используя функцию для вывода сообщения об ошибке и выхода из программы).