Может ли скрипт fish различать момент получения и выполнения?

Может ли скрипт fish различать момент получения и выполнения?

У меня есть скрипт 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используется для обработки выходных данных некоторого процесса так, как будто это файл.Документация

Связанный контент