Либо то, что я здесь спрашиваю, крайне неортодоксально / нетрадиционно / рискованно, либо мои навыки в Google-фу просто не подходят к нулю ...
В bash
сценарии оболочки есть какой-нибудь простой способ узнать, получен ли он от другого сценария оболочки, или он запускается сам по себе? Другими словами, возможно ли различить следующие два поведения?
# from another shell script
source myScript.sh
# from command prompt, or another shell script
./myScript.sh
Я думаю о том, чтобы создать подобный утилитам сценарий оболочки, содержащий bash
функции, которые можно сделать доступными при получении. Когда этот скрипт запускается сам по себе, мне бы хотелось, чтобы он выполнял определенные операции, также основываясь на определенных функциях. Существует ли какая-то переменная окружения, которую может использовать этот сценарий оболочки, например
some_function() {
# ...
}
if [ -z "$IS_SOURCED" ]; then
some_function;
fi
Предпочтительно, я ищу решение, которое не требует скрипта вызывающей стороны для установки каких-либо флаговых переменных.
редактировать : я знаю разницу между поиском и запуском скрипта, что я пытаюсь выяснить здесь, возможно ли определить разницу в скрипте, который используется (в обоих направлениях).
источник
.
команде, а о том, чтобы определить, был ли скрипт поставлен или работает нормально (т.е. в подоболочке).Ответы:
Да - переменная $ 0 дает имя скрипта во время его запуска:
Который работает как:
Это не может служить источником для интерактивной оболочки, но вы поняли эту идею (я надеюсь).
Обновлено, чтобы включить BASH_SOURCE - спасибо, hjk
источник
Комбинация ответа @ DarkHeart с переменной окружения,
BASH_SOURCE
кажется, добивается цели :edit Кажется, было бы более простым решением, если бы я просто посчитал количество элементов в
BASH_SOURCE
массиве:источник
Я только что создал такой же библиотечный скрипт, который работает так же, как BusyBox. В нем я использую следующую функцию, чтобы проверить, получен ли он ...
Поддерживаемый Bash массив FUNCNAME по сути является стеком вызовов функций.
$FUNCNAME
(или${FUNCNAME[0]}
) - имя выполняемой в данный момент функции.${FUNCNAME[1]}
это имя функции, вызвавшей ее, и так далее.Самый верхний элемент - это специальное значение для самого скрипта. Это будет содержать ...
Функция выше на самом деле работает только при вызове на уровне сценария (это все, что мне нужно). Сбой при вызове из другой функции, потому что номер элемента массива будет неправильным. Чтобы заставить его работать где угодно, нужно найти вершину стека и проверить это значение, что более сложно.
Если вам это нужно, вы можете получить номер элемента массива "вершины стека" с помощью ...
${#FUNCNAME[@]}
это количество элементов в массиве. В качестве массива, начинающегося с нуля, мы вычитаем 1, чтобы получить последний элемент #.Эти три функции используются вместе для создания трассировки стека функций, аналогичной Python, и они могут дать вам лучшее представление о том, как все это работает ...
Обратите внимание, что FUNCNAME, BASH_SOURCE и BASH_LINENO - это 3 массива, поддерживаемых bash, как если бы они были одним трехмерным массивом.
источник
Просто хочу добавить, что подсчет массива кажется ненадежным, и, вероятно, не следует предполагать, что
source
он использовался, поскольку использование точки (.
) также очень распространено (и предшествуетsource
ключевому слову).Например, для
sourced.sh
скрипта, содержащего толькоecho $0
:Предлагаемые сравнительные решения работают лучше.
источник
Один способ, который также работает при поиске из интерактивной оболочки :
BASH_LINENO
Переменный также массив со всеми линиями функция вызова была казнена в. Он будет равен нулю, если вы вызываете скрипт напрямую, или целое число, соответствующее номеру строки.Переменная BASH_ * документы
источник