Shell 仅在其他脚本中使用.ksh脚本的函数

Shell 仅在其他脚本中使用.ksh脚本的函数,shell,ksh,Shell,Ksh,我有一个脚本a.sh,它有: a() { echo "123" } echo "dont" b() { echo "345" } 然后我有另一个脚本b.sh,它有: a() { echo "123" } echo "dont" b() { echo "345" } 我想做的就是在b中使用a,但当我找到它时,我不想打印a()中的任何内容 我现在只想寻找它的来源 所以我做了,sourcea.shinb.sh 但它不起作用

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

a() {
     echo "123"
  }

 echo "dont"
 b() {
       echo "345"
 }
然后我有另一个脚本
b.sh
,它有:

a() {
     echo "123"
  }

 echo "dont"
 b() {
       echo "345"
 }
我想做的就是在
b
中使用
a
,但当我找到它时,我不想打印
a()中的任何内容

我现在只想寻找它的来源

所以我做了,source
a.sh
in
b.sh

但它不起作用

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


如果我做了
/a、 sh
in
b.sh
它在
a.sh
中打印所有内容

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

#!/bin/sh

a(){
   echo Inside a, with $1
}

b(){
   echo Inside b, with $1
}
然后在脚本1中执行以下操作:

#!/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

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

#!/bin/sh

a(){
   echo Inside a, with $1
}

b(){
   echo Inside b, with $1
}
然后在脚本1中执行以下操作:

#!/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

一种适用于任何符合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

一种适用于任何符合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

我在shell脚本中采用了一种风格,允许我将每个脚本设计为一个潜在的库,使其在源代码(使用
…/path/script
)和直接执行时表现不同。您可以将其与python的
技巧进行比较,如果
技巧是

我没有发现一种方法可以在不显式引用脚本名称的情况下跨所有Bourne shell子体移植,但我使用的是:

a(){
呼应
}
b(){
回声b
}
(程序=xyzy
set-u-e
每箱0元
*${program}):;;
*)退出;;
以撒
#主要
A.
B
)
此方法的规则严格如下:

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

  • 然后,在最后,创建一个子shell

  • 子shell中的第一个操作测试 它的来源。如果是,请退出子shell。 如果没有,请运行命令


  • 我在shell脚本中采用了一种风格,允许我将每个脚本设计为一个潜在的库,使其在源代码(使用
    …/path/script
    )和直接执行时表现不同。您可以将其与python的
    技巧进行比较,如果
    技巧是

    我没有发现一种方法可以在不显式引用脚本名称的情况下跨所有Bourne shell子体移植,但我使用的是:

    a(){
    呼应
    }
    b(){
    回声b
    }
    (程序=xyzy
    set-u-e
    每箱0元
    *${program}):;;
    *)退出;;
    以撒
    #主要
    A.
    B
    )
    
    此方法的规则严格如下:

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

  • 然后,在最后,创建一个子shell

  • 子shell中的第一个操作测试 它的来源。如果是,请退出子shell。 如果没有,请运行命令



  • 你会做
    吗/a、 sh>/dev/null
    ?在bash中,可以通过查看
    ${bash_SOURCE[@]}
    的值来检查这一点。对ksh不太确定——ksh和ksh版本之间有很大差异。你能指定你使用的是哪一个吗?@charlesduff-你是说${#BASH_SOURCE[a.sh]}???usr/bin/kshPut
    a()
    单独保存在一个文件中,并将其源代码转换成两个文件。@MarkSetchell-请举例说明将其源代码转换成两个文件是什么意思/a、 sh>/dev/null
    ?在bash中,可以通过查看
    ${bash_SOURCE[@]}
    的值来检查这一点。对ksh不太确定——ksh和ksh版本之间有很大差异。你能指定你使用的是哪一个吗?@charlesduff-你是说${#BASH_SOURCE[a.sh]}???usr/bin/kshPut
    a()
    单独放在一个文件中,并将其源代码转换成两个文件。@MarkSetchell-你能举例说明一下源代码转换成bothIt是什么意思吗?如果可以的话,让你的另一个使用
    a()
    的脚本也只是
    functionLib.sh中的点,就像我第二个示例代码的第二行一样。为了理解,因此,您正在运行另一个脚本,即调用functionlib.sh并使用42,它正在打印a()中的内容,对吗?我正在将一个或多个由多个脚本使用的函数放在一个位置、一个文件中,这样所有想要使用它们的脚本之间的维护更少,一致性更强。哦。如果我有第三个文件。它有b43,我如何在你写的函数中使用这个输出。现在我认为$1对bothNo来说是冲突的,$1是调用函数的参数-每个函数都有自己的参数。它会工作的,让你的另一个使用
    a()
    的脚本也只是
    functionLib.sh中的点,就像我的第二个示例代码的第二行。为了理解,你正在运行另一个脚本,那就是调用functionlib.sh并使用一个42,它正在打印a()中的内容,对吗?我正在将一个或多个由多个脚本使用的函数放在一个位置、一个文件中,这样所有想要使用它们的脚本之间的维护更少,一致性更高。哦。如果我有第三个文件。它有b43,我如何在你写的函数中使用这个输出。现在我认为$1对bothNo来说会有冲突,$1是调用函数的参数-每个函数都有自己的参数。如果您想避免子shell开销,您可以使用
    return
    而不是
    exit
    ——当然这意味着您希望在测试之后/测试之下移动前导中的副作用部分。@C