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

Я пытаюсь выставить из скрипта только определенные функции.
Например, допустим, у меня есть скрипт hello_world.sh и он имеет 2 функции: hello и world:

## hello_world.sh - name of the file, not the beginning of file
hello() { echo "Hello"; }
world() { echo "World"; }

. Я хочу, чтобы скрипт use.sh экспортировал только функцию, которую я запрашиваю Пример hello. Для этого я бы вызвал функцию use из use.sh с параметром, сообщающим ему, какую функцию я хочу экспортировать:
unset use hello world; . use.sh && use hello && hello && echo "Should succeed"
world || echo "Should fail and reach here because there is no such function"

Я хотел бы избежать сохранения функций во временных файлах, чтобы лучше изолировать различные (ba) sh среды. Хранение во временном файле может выглядеть примерно так:

## use.sh - name of the file, not the beginning of file
#! /bin/sh

use() {
  local env_file="$(/bin/mktemp)"
  (. ./hello_world.sh; declare -pfx "$@") > "${env_file}"
  . "${env_file}"
  /bin/rm -f "${env_file}"
}

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

1
задан 26 May 2016 в 06:57

1 ответ

Можно использовать замена процесса , так, чтобы use был бы похож:

use() {  
  . <(. ./hello_world.sh; declare -f "$@")
}

примечание Стороны:

  • declare не POSIX, /bin/sh может не поддерживать его, таким образом use.sh не должен иметь /bin/sh в хижине. (Не то, чтобы это имеет значение очень, с тех пор use.sh получен вместо выполняемого.)
1
ответ дан 26 May 2016 в 16:57

Другие вопросы по тегам:

Похожие вопросы: