Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 是否有任何现有方法可以从其他脚本导入函数,而不必对整个脚本进行寻源?_Shell - Fatal编程技术网

Shell 是否有任何现有方法可以从其他脚本导入函数,而不必对整个脚本进行寻源?

Shell 是否有任何现有方法可以从其他脚本导入函数,而不必对整个脚本进行寻源?,shell,Shell,我正在处理一个大型shell程序,需要一种方法根据需要从其他脚本导入函数,而不必使用该脚本中的所有内部函数污染全局范围 更新:但是,这些导入的函数具有内部依赖性。因此,导入的函数必须在其脚本的上下文中执行 我想到了这一点,想知道是否有任何现有的战略存在,如果没有,也许这是一个非常糟糕的想法 我的解决方案的示例用法: main.sh import user get_name import user set_name echo "hello $(get_name)" echo "Enter a

我正在处理一个大型shell程序,需要一种方法根据需要从其他脚本导入函数,而不必使用该脚本中的所有内部函数污染全局范围

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

我想到了这一点,想知道是否有任何现有的战略存在,如果没有,也许这是一个非常糟糕的想法

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

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

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

$ 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。你的代码确实有很多我还没有完全了解的特性。您指的是哪种灵活性?这当然是一种方式,但不像我发布的解决方案那样全面/灵活。谢谢你的意见。不同的解决方案有不同的优点,我相信你的解决方案是合适的