Я пытаюсь выставить из скрипта только определенные функции.
Например, допустим, у меня есть скрипт 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}"
}
Как я мог вместо этого не создавать файлы (это похоже на какой-то обходной путь) и напрямую выставлять функции?
Можно использовать замена процесса , так, чтобы use
был бы похож:
use() {
. <(. ./hello_world.sh; declare -f "$@")
}
примечание Стороны:
declare
не POSIX, /bin/sh
может не поддерживать его, таким образом use.sh
не должен иметь /bin/sh
в хижине. (Не то, чтобы это имеет значение очень, с тех пор use.sh
получен вместо выполняемого.)