是否存在从其他脚本导入函数而不需要整个脚本的现有方法?

时间:2016-07-06 19:04:07

标签: shell

我正在开发一个大型shell程序,需要一种方法从需要的其他脚本中导入函数,而不会使用该脚本中的所有内部函数来污染全局作用域。

更新:但是,这些导入的功能具有内部依赖性。因此导入的函数必须在其脚本的上下文中执行。

我想出了这个solution并想知道是否有任何现有的策略,如果没有,也许这是一个非常糟糕的主意?

PLEASE TAKE A LOOK AT THE POSTED SOLUTION BEFORE RESPONDING

我的解决方案的示例用法:

main.sh

import user get_name
import user set_name

echo "hello $(get_name)"
echo "Enter a new user name :"
while true; do
    read user_input < /dev/tty
done
set_name $user_input

user.sh

import state

set_name () {
    state save "user_name" "$1"
}

get_name () {
    state get_value "user_name"
}

4 个答案:

答案 0 :(得分:1)

作为一种方法,您可以在脚本中添加注释,以指示您要停止采购的位置:

$ cat script
fn() { echo "You are running fn"; }
#STOP HERE
export var="Unwanted name space pollution"

然后,如果你使用bash,请按照以下方式来源:

source <(sed '/#STOP HERE/q' script)

<(...)是流程替换,我们的流程sed '/#STOP HERE/q' script只是从脚本中提取行,直到达到停止行。

添加更精确的控制

如果我们添加开始和停止标志,我们可以从文件中选择特定部分:

$ cat script
export var1="Unwanted name space pollution"
#START
fn1() { echo "You are running fn1"; }
#STOP
export var2="More unwanted name space pollution"
#START
fn2() { echo "You are running fn2"; }
#STOP
export var3="More unwanted name space pollution"

然后像这样获取文件:

source <(sed -n '/#START/,/#STOP/p' script)

答案 1 :(得分:1)

  1. 创建执行此操作的独立shel脚本

    • 将有2个参数,文件名和函数名称
    • 它将首先获取输入文件
    • 然后使用declare -f function name
  2. 在您的代码中,您可以包含此类函数

    eval&#34; ./ importfunctions.sh filename functionaname&#34;

  3. 这里发生了什么:

    步骤1基本上读取文件并在新的shell环境中获取它。然后它将回显函数声明

    第2步将该功能评估为我们的主要代码

    所以最后的结果好像我们在主脚本

    中只写了那个函数

答案 2 :(得分:1)

当脚本中的函数缩进时,直到结束}并且全部以关键字function开头,您可以在不更改原始文件的情况下包含特定功能:
largeshell.sh

#!/bin/bash

function demo1 {
   echo "d1"
}

function demo2 {
   echo "d2"
}

function demo3 {
   echo "d3"
}

function demo4 {
   echo "d4"
}

echo "Main code of largeshell... "
demo2

现在展示如何获取demo1()并忘记demo4():

source <(sed -n '/^function demo1 /,/^}/p' largeshell.sh)
source <(sed -n '/^function demo3 /,/^}/p' largeshell.sh)
demo1
demo4

或者循环中的所有函数:

for f in demo1 demo3; do
   echo sourcing $f
   source <(sed -n '/^function '$f' /,/^}/p' largeshell.sh)
done
demo1
demo4

当你source一个特殊的脚本时,你可以使它变得更加华丽:

  • grep所有以largeshell.开头的字符串,例如largefile.demo1
  • 生成类似largefile.demo1的函数,它将调用demo1
  • 并获取所有被调用的函数。

您的新脚本将如下所示

source function_includer.sh
largeshell.demo1
largeshell.demo4

编辑: 您可能想重新考虑您的要求 以上解决方案不仅速度慢,而且还会让人难以接受 男人和女士谁做了bigshell.sh。一旦他们要重构他们的代码或用其他语言的东西替换它, 他们还必须重构,测试和部署您的代码 一个更好的路径是将函数从largeshell.sh提取到一些较小的文件(“modules”)中,并将它们放在一个共享目录(shlib?)中。 名称为sqlutil.sh,datetime.sh,formatting.sh,mailstuff.sh和comm.sh,您可以选择所需的包含文件(而largefile.sh将包含所有这些文件)。

答案 3 :(得分:0)

已经有一段时间了,看来我的original solution是最好的那个。感谢您的反馈。