如何从源脚本中仅导出特定功能

如何从源脚本中仅导出特定功能

我尝试从脚本中仅公开特定功能。
例如,假设我有脚本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。为此,我将使用参数调用该函数useuse.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是来源而不是执行。)

相关内容