【问题标题】:Only use functions of .ksh script into other script仅将 .ksh 脚本的功能用于其他脚本
【发布时间】:2014-09-16 19:46:00
【问题描述】:

我有一个脚本a.sh,它有:

a() {
     echo "123"
  }

 echo "dont"

然后我有其他脚本b.sh 有:

 b() {
       echo "345"
 }

我只想在b 中使用a,但是当我获取它时,我不想打印a()echo "Dont" 中的任何内容。

我现在只想获取它。

我做到了,来源a.shb.sh

但它不起作用。

采购的原因是。因此,如果我愿意,我也可以随时调用任何函数。

如果我在b.sh 中执行. /a.sh,它会打印a.sh 中的所有内容。

【问题讨论】:

  • 可以. /a.sh > /dev/null吗?
  • 在 bash 中,您可以通过查看 ${#BASH_SOURCE[@]} 的值来检查这一点。不确定 ksh - 并且 ksh 版本彼此之间存在很大差异。你能指定你使用的是哪个吗?
  • @CharlesDuffy - 你的意思是 ${#BASH_SOURCE[a.sh]} ??? usr/bin/ksh
  • a() 单独放入一个文件中,并将其导入到两者中。
  • @MarkSetchell - 你能举个例子说明你把它输入两者的意思吗

标签: shell ksh


【解决方案1】:

一种适用于任何符合 POSIX 的 shell 的方法是:

# put function definitions at the top
a() {
     echo "123"
}

# divide them with a conditional return
[ -n "$FUNCTIONS_ONLY" ] && return

# put direct code to execute below
echo "dont"

...在您的其他脚本中:

 FUNCTIONS_ONLY=1 . other.sh

【讨论】:

    【解决方案2】:

    在名为functionLib.sh 的文件中创建一个常用函数库,如下所示:

    #!/bin/sh
    
    a(){
       echo Inside a, with $1
    }
    
    b(){
       echo Inside b, with $1
    }
    

    然后在script1 中,执行以下操作:

    #!/bin/sh
    . functionLib.sh    # Source in the functions
    
    a 42                # Use one
    b 37                # Use another
    

    在另一个脚本中,script2 重新使用函数:

    #!/bin/sh
    . functionLib.sh    # Source in the functions
    
    a 23                # Re-use one
    b 24                # Re-use another
    

    【讨论】:

    • 它会起作用,让您使用a() 的其他脚本也只是dot in functionLib.sh,就像我的第二个示例代码的第二行一样。
    • 只是为了理解,所以您正在运行另一个脚本,即调用 functionlib.sh 并使用 42,它正在打印 a() 中的 whatevr 是否正确?
    • 我将一个或多个由多个脚本使用的函数放在一个地方,一个文件中,因此所有想要使用它们的脚本之间的维护更少,一致性更高。
    • 哦。所以如果我有第三个文件。其中有 b 43 我如何在您编写的函数中使用该输出。现在我认为 1 美元会发生冲突
    • 不,$1 是调用函数的参数——每个函数都有自己的参数。
    【解决方案3】:

    我在我的 shell 脚本中采用了一种风格,允许我将每个脚本设计为一个潜在的库,使其在获取源(使用. .../path/script)和直接执行时表现不同。您可以将此与 python if __name__ == '__main__': 技巧进行比较。

    我还没有找到一种可以在所有 Bourne shell 后代之间移植而不明确引用脚本名称的方法,但这就是我使用的方法:

    a() {
        echo a
    }
    
    b() {
        echo b
    }
    
    
    (program=xyzzy
      set -u -e   
      case $0 in
      *${program}) : ;;
      *) exit;;
      esac
    
      # main
      a
      b
    )
    

    此方法的规则是严格的:

    1. 开始一个只有函数的部分。 没有变量分配或任何其他活动。

    2. 然后,在最后,创建一个子shell ( ... )

    3. 子shell中的第一个动作测试是否 它正在被采购。如果是这样,退出子shell。 如果没有,请运行命令。

    【讨论】:

    • 如果你想避免子shell开销,你可以使用return而不是exit——当然这意味着你想在你的序言之后移动副作用部分/ 在测试之下。
    • @CharlesDuffy 我担心使用return 可能不适用于所有shell。我在 ubuntu 上使用 ksh93、bash 和 /bin/sh 测试了上述内容(我认为这实际上是 dash)。
    • @HenkLangeveld,有问题的行为由 POSIX 明确指定;见pubs.opengroup.org/onlinepubs/9699919799/utilities/…
    • @CharlesDuffy 诚然,尽管我使用过不支持这种行为的 really old shell。实际上,我更喜欢使用 bash 和 ksh93 支持的功能超集。
    • 当然——POSIX 之前的 Bourne 是它自己的动物,但发现的唯一(现代)地方是古老的 Solaris。不过,在 ksh93、bash 或 dash 中使用 POSIX 功能不会有任何问题,而这三个是您提到的测试对象。
    猜你喜欢
    • 2021-12-14
    • 2016-01-25
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多