Сделать функции оболочки можно найти только в области импорта файла - PullRequest
0 голосов
/ 03 апреля 2020

Я объявляю функции в одном файле оболочки

# a.sh
foo() { ... }
function bar() { ... }

и импортирую в другой файл оболочки с помощью source:

# b.sh
source ./a.sh

# invoke foo and bar
foo
bar

Теперь в оболочке я могу использовать foo / bar после выполнения b.sh

$ source b.sh
...

# I can call foo or bar now in the shell (undesirable)
$ foo
...

Как сделать функции локальными переменными в области действия импортируемого файла и избежать их загрязнения глобальными переменными / переменными среды?

Ответы [ 3 ]

1 голос
/ 04 апреля 2020

Таким способом можно изолировать частные функции оболочки.

# sourced a.sh

# a_main is exposed public
my_public_a() (
  private_a() {
    echo "I am private_a only visible to my_public_a"
  }

  private_b() {
    echo "I am get_b only visible to my_public_a"
  }

  case "$1" in
    a) private_a;;
    b) private_b;;
    *) exit;;
  esac
)
# b.sh
source a.sh

my_public_a a
my_public_a b
private_a # command not found
private_b # command not found
1 голос
/ 03 апреля 2020

В оболочке нет такой вещи, как «область видимости файла» - только глобальная область действия и область действия функции. Самое близкое, что вы можете сделать, это запустить b. sh в другой оболочке:

$ b.sh   # run b.sh rather than reading it into the current shell

тогда все в b. sh просто будет в этой другой оболочке и "go прочь", когда это выходит. Но это относится к всему определенному в b. sh - ко всем функциям, псевдонимам, окружению и другим переменным.

0 голосов
/ 03 апреля 2020

Несмотря на то, что bash не обеспечивает прямой поддержки, все, что вам нужно, все еще достижимо:

#!/usr/bin/env bash
# b.sh

if  [[ "${BASH_SOURCE[0]}" = "$0" ]] ;then
    source ./a.sh

    # invoke foo and bar
    foo
    bar
else
    echo "b.sh is being sourced. foo/bar will not be available."
fi

Выше не на 100% надежно, но должно охватывать большинство случаев.

...