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