我尝试从脚本中仅公开特定功能。
例如,假设我有脚本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
在 shebang 中。(这并不重要,因为它use.sh
是来源而不是执行。)