我有一个脚本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
中打印所有内容。
答案 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
)
此方法的规则严格:
启动除功能之外的任何部分。 没有变量分配或任何其他活动。
然后,在最后,创建一个子shell (
... )
子shell内的第一个动作是否测试 它的来源。如果是这样,退出子shell。 如果没有,请运行命令。