Shell 是否有任何现有方法可以从其他脚本导入函数,而不必对整个脚本进行寻源?
我正在处理一个大型shell程序,需要一种方法根据需要从其他脚本导入函数,而不必使用该脚本中的所有内部函数污染全局范围 更新:但是,这些导入的函数具有内部依赖性。因此,导入的函数必须在其脚本的上下文中执行 我想到了这一点,想知道是否有任何现有的战略存在,如果没有,也许这是一个非常糟糕的想法 我的解决方案的示例用法: main.shShell 是否有任何现有方法可以从其他脚本导入函数,而不必对整个脚本进行寻源?,shell,Shell,我正在处理一个大型shell程序,需要一种方法根据需要从其他脚本导入函数,而不必使用该脚本中的所有内部函数污染全局范围 更新:但是,这些导入的函数具有内部依赖性。因此,导入的函数必须在其脚本的上下文中执行 我想到了这一点,想知道是否有任何现有的战略存在,如果没有,也许这是一个非常糟糕的想法 我的解决方案的示例用法: main.sh import user get_name import user set_name echo "hello $(get_name)" echo "Enter a
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
作为一种方法,您可以在脚本中添加注释,以指示您要停止采购的位置:
$ cat script
fn() { echo "You are running fn"; }
#STOP HERE
export var="Unwanted name space pollution"
然后,如果您使用的是bash,则按如下方式对其进行源代码设置:
source <(sed '/#STOP HERE/q' script)
source <(sed -n '/#START/,/#STOP/p' script)
然后按如下方式获取文件源:
source <(sed '/#STOP HERE/q' script)
source <(sed -n '/#START/,/#STOP/p' script)
source作为一种方法,您可以在脚本中添加一条注释,以指示您要在何处停止寻源:
$ cat script
fn() { echo "You are running fn"; }
#STOP HERE
export var="Unwanted name space pollution"
然后,如果您使用的是bash,则按如下方式对其进行源代码设置:
source <(sed '/#STOP HERE/q' script)
source <(sed -n '/#START/,/#STOP/p' script)
然后按如下方式获取文件源:
source <(sed '/#STOP HERE/q' script)
source <(sed -n '/#START/,/#STOP/p' script)
源代码
创建执行此操作的独立shel脚本
- 将有2个参数,即文件名和函数名
- 它将首先获取输入文件的源代码
- 然后它将使用declare-f函数名
在代码中可以包含如下函数
eval“/importfunctions.sh文件名functionname”
这里发生了什么:
步骤1基本上读取文件并在新的shell环境中对其进行源代码转换。然后它将回显函数声明
第2步将把这个函数求值到主代码中
所以最终的结果就像我们在主脚本中只编写了那个函数一样
创建执行此操作的独立shel脚本
- 将有2个参数,即文件名和函数名
- 它将首先获取输入文件的源代码
- 然后它将使用declare-f函数名
在代码中可以包含如下函数
eval“/importfunctions.sh文件名functionname”
这里发生了什么:
步骤1基本上读取文件并在新的shell环境中对其进行源代码转换。然后它将回显函数声明
第2步将把这个函数求值到主代码中
所以最终的结果是,如果我们只在主脚本中编写了该函数,那么当脚本中的函数缩进到结束时,所有函数都以关键字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():
编辑:
您可能需要重新考虑您的要求。
上述解决方案不仅速度慢,而且也会给客户带来困难
那些做了“慷慨地狱”的男人和女人。一旦他们要重构代码或用另一种语言替换代码,
他们还必须重构、测试和部署您的代码。
更好的方法是将函数从largeshell.sh提取到一些较小的文件(“模块”)中,并将它们放在共享目录(shlib?)中。
使用sqlutil.sh、datetime.sh、formatting.sh、mailstuff.sh和comm.sh等名称,您可以选择所需的包含文件(largefile.sh将包含所有这些文件) 当脚本中的函数缩进到结束时}
并且所有函数都以关键字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():
编辑:
您可能需要重新考虑您的要求。
上述解决方案不仅速度慢,而且也会给客户带来困难
那些做了“慷慨地狱”的男人和女人。一旦他们要重构代码或用另一种语言替换代码,
他们还必须重构、测试和部署您的代码。
更好的方法是将函数从largeshell.sh提取到一些较小的文件(“模块”)中,并将它们放在共享目录(shlib?)中。
使用sqlutil.sh、datetime.sh、formatting.sh、mailstuff.sh和comm.sh等名称,您可以选择所需的包含文件(largefile.sh将包含所有这些文件) 已经有一段时间了,看来我的手机是最好的。感谢您的反馈。已经有一段时间了,看来我的手机是最好的。感谢您的反馈。这当然是一种方法,但不如我发布的解决方案全面/灵活。感谢您的投入。不同的解决方案有不同的优点,我相信您的解决方案非常适合您的需求。据我所知,该解决方案将整个脚本源代码放在子shell中(正确吗?)。根据脚本的不同,这可能会产生各种副作用(执行冗长的计算、创建、删除、移动文件……发送电子邮件等)。相比之下,这里的方法通过只寻找最小值来避免这种情况。因为这只需要几行代码,而不是100行,所以它还提供了简单性和清晰性。这种方法也不需要eval
。同样,(我在前面的评论中已经没有字符了),我确信您的解决方案非常适合您的需求。我只是指出,可能还有其他具有其他目标或需求的用例。我同意,您的解决方案要简洁得多。但是,它没有提供所需的灵活性。所有脚本都包含函数,因此读取文件的开销很小,这是一种公平的灵活性交易。OK。你的代码确实有很多我还没有完全了解的特性。您指的是哪种灵活性?这当然是一种方式,但不像我发布的解决方案那样全面/灵活。谢谢你的意见。不同的解决方案有不同的优点,我相信你的解决方案是合适的