
У меня есть скрипт fish, который экспортирует некоторые переменные и запускает команду в конце. Я хотел бы иметь возможность использовать этот файл, чтобы перенести эти переменные в текущий сеанс оболочки, но без выполнения команды в конце.
Вопрос: Могу ли я определить, выполняется ли текущий файл или он является источником внутри файла?
решение1
Вы можете использовать $_
переменную окружения, чтобы увидеть, «запускается» ли ваш скрипт командой source
:
#!/bin/fish
if test "$_" = source
echo got sourced
else
echo was execed
end
решение2
Вы можете использовать $_
переменную окружения, чтобы увидеть, «запускается» ли ваш скрипт командой source
. Обратите внимание, что source
команда имеет общий псевдоним (« .
«), поэтому вы должны проверить $_
переменную окружения и по отношению к , source
и .
.
#!/bin/fish
if test "$_" != "source" -a "$_" != "."
echo "not sourced"
else
echo "was sourced"
end
Распространенным вариантом использования этого может быть выдача предупреждения пользователю, если скрипт не был получен из исходного кода:
if test "$_" != "source" -a "$_" != "."
echo "Run this script with \". ./activate.fish\" (aka: \"source ./activate.fish\")."
exit 1
end
Конечно, замените activate.fish
на название вашего скрипта.
решение3
Я думаю, вы не понимаете, что делает "source"ing скрипта. Обычно выполнение скрипта запустит его в отдельном процессе. Sourcing его запустит втекущая оболочка. Он по-прежнему будет выполнять каждую строку.
Вероятно, вы хотите отфильтровать последнюю строку. Попробуйте:
source (sed '$d' filename | psub)
Команда psub
используется для обработки выходных данных некоторого процесса так, как будто это файл.Документация