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

Я пытаюсь выставить из скрипта только конкретные функции.
Например, допустим, у меня есть сценарий 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 источник вместо выполненного.)
Другие вопросы по тегам