我正在开发一个大型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"
}
答案 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)
创建执行此操作的独立shel脚本
在您的代码中,您可以包含此类函数
eval&#34; ./ importfunctions.sh filename functionaname&#34;
这里发生了什么:
步骤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
一个特殊的脚本时,你可以使它变得更加华丽:
largeshell.
开头的字符串,例如largefile.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是最好的那个。感谢您的反馈。