仅将.ksh脚本的功能用于其他脚本

时间:2014-09-16 19:46:01

标签: shell ksh

我有一个脚本a.sh,其中包含:

a() {
     echo "123"
  }

 echo "dont"

然后我有其他脚本b.sh,其中包含:

 b() {
       echo "345"
 }

我想要做的就是在a中使用b,但是当我找到它时,我不想打印a()或{{1}中的任何内容}。

我现在只想采购它。

所以我做了,echo "Dont"

中来源a.sh

但它不起作用。

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

如果我在b.sh. /a.sh,则会在b.sh中打印所有内容。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

在名为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

答案 2 :(得分:1)

我在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。 如果没有,请运行命令。