Вопрос или проблема
Я пишу скрипт в рамках процесса восстановления поврежденной среды. Он использует несколько других скриптов, и я хочу, чтобы все эти переменные сохранялись в командной строке после выполнения скрипта. По этой причине скрипт необходимо запускать с помощью ./script.sh
, а не с помощью bash script.sh
.
Я хочу добавить строку или две в скрипт, чтобы убедиться, что пользователь запустил скрипт правильно, а не использовал bash script.sh
, так как это вызовет проблемы в дальнейшей части процесса.
Как я могу проверить, был ли скрипт запущен с использованием ./script.sh
(или по крайней мере, что команды source сохранятся после завершения скрипта)?
Я заметил, что ошибки начинаются с имени скрипта, как он был вызван, поэтому я загрузил строку ошибки в массив, что позволяет мне просто проверить первый элемент в массиве (первое слово ошибки). Обратите внимание, что мне также пришлось перенаправить STDERR
в STDOUT
.
IFS=' ' read -ra WORDS <<< $("" 2>&1)
if [ "${WORDS[0]%:*}" == "./test.sh" ]; then
echo "using ./test.sh"
else
echo "using bash test.sh (or similar)"
fi
Ответ или решение
В контексте поставленной задачи, важно различать два варианта исполнения оболочного скрипта: непосредственно через ./script.sh
, что подразумевает выполнение скрипта в текущем shell-сессии, и с использованием bash script.sh
, что запускает новый экземпляр оболочки, тем самым изолируя изменения окружения внутри данной сессии. Если цель заключается в том, чтобы изменения переменных окружения были сохранены в текущем shell-процессе, то необходимо убедиться, что скрипт запускается именно через ./script.sh
.
Теоретические аспекты
Когда скрипт исполняется с помощью ./script.sh
, операционная система рассматривает данный файл как исполняемый и выполняет указания, содержащиеся в нем, на уровне того shell-процесса, который инициировал запуск. Это достигается за счет shebang (#!/bin/bash
) в начале файла, который указывает, какую оболочку использовать для исполнения скрипта. В этом случае все экспортированные переменные или изменения в окружении будут доступны после завершения выполнения скрипта, так как изменения происходили в текущем shell-процессе.
С другой стороны, если скрипт запускается через bash script.sh
, то это создаёт новый дочерний процесс оболочки. Все изменения окружения произойдут внутри этой новой оболочки и не будут сохранены после её завершения, так как они не влияют на родительский процесс.
Пример
Вы можете проверить способ вызова скрипта с помощью анализа параметров, доступных внутри скрипта. Например, через переменную 0
, которая в bash содержит путь к исполняемому скрипту:
if [[ "$0" == "./script.sh" ]]; then
echo "Скрипт запущен корректно через ./script.sh"
else
echo "Скрипт запущен с помощью bash script.sh или аналогично, переменные окружения не сохранятся."
exit 1
fi
Применение
Таким образом, добавление кода, как указано выше, позволит вам безошибочно определить, как был вызван ваш скрипт. Это крайне важно в ситуациях, где необходимо сохранить изменения окружения после его выполнения, такие как восстановление состояния окружения или запуск процедур, где предусловия и постусловия контролируются на уровне переменных среды.
Практически важные замечания
-
Настройка прав доступа: Для использования
./script.sh
убедитесь, что скрипт имеет соответствующие разрешения на выполнение. Вы можете установить их с помощью командыchmod +x script.sh
. -
Зависимости от конкретного shell: Убедитесь, что ваш скрипт совместим с указанной оболочкой в shebang. Некоторые системы могут использовать разные версии bash или sh, что может повлиять на выполнение скрипта.
-
Практика использования абсолютных путей: Важно учитывать, что относительный путь
./
подразумевает исполнение в текущем каталоге. При изменении рабочего каталога скрипт может не быть доступен. Лучше использовать абсолютные пути для полной уверенности в корректности исполнения. -
Тестирование и валидация: Всегда тщательно тестируйте ваш скрипт в различных сценариях вызова, чтобы удостовериться в корректном поведении в соответствии с вашими требованиями.
В контексте написания скриптов и их исполнения на уровне операционной системы, внимание к вышеописанным деталям поможет предотвратить нежелательные ошибки и упростит сопровождение и поддержку кода. Такие тонкости, как корректный запуск скрипта, могут играть ключевую роль в прекрасной работоспособности и предсказуемости скриптов автоматики, часто использующихся в DevOps и IT администрировании.