Как я могу проверить, был ли скрипт вызван с помощью ./script.sh или bash script.sh?

Вопрос или проблема

Я пишу скрипт в рамках процесса восстановления поврежденной среды. Он использует несколько других скриптов, и я хочу, чтобы все эти переменные сохранялись в командной строке после выполнения скрипта. По этой причине скрипт необходимо запускать с помощью ./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

Применение

Таким образом, добавление кода, как указано выше, позволит вам безошибочно определить, как был вызван ваш скрипт. Это крайне важно в ситуациях, где необходимо сохранить изменения окружения после его выполнения, такие как восстановление состояния окружения или запуск процедур, где предусловия и постусловия контролируются на уровне переменных среды.

Практически важные замечания

  1. Настройка прав доступа: Для использования ./script.sh убедитесь, что скрипт имеет соответствующие разрешения на выполнение. Вы можете установить их с помощью команды chmod +x script.sh.

  2. Зависимости от конкретного shell: Убедитесь, что ваш скрипт совместим с указанной оболочкой в shebang. Некоторые системы могут использовать разные версии bash или sh, что может повлиять на выполнение скрипта.

  3. Практика использования абсолютных путей: Важно учитывать, что относительный путь ./ подразумевает исполнение в текущем каталоге. При изменении рабочего каталога скрипт может не быть доступен. Лучше использовать абсолютные пути для полной уверенности в корректности исполнения.

  4. Тестирование и валидация: Всегда тщательно тестируйте ваш скрипт в различных сценариях вызова, чтобы удостовериться в корректном поведении в соответствии с вашими требованиями.

В контексте написания скриптов и их исполнения на уровне операционной системы, внимание к вышеописанным деталям поможет предотвратить нежелательные ошибки и упростит сопровождение и поддержку кода. Такие тонкости, как корректный запуск скрипта, могут играть ключевую роль в прекрасной работоспособности и предсказуемости скриптов автоматики, часто использующихся в DevOps и IT администрировании.

Оцените материал
Добавить комментарий

Капча загружается...