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()中的任何内容
我现在只想寻找它的来源
所以我做了,sourcea.sh
inb.sh
但它不起作用
采购的原因是。所以,如果我愿意,我也可以在我愿意的时候调用任何函数
如果我做了/a、 sh
inb.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/kshPuta()
单独保存在一个文件中,并将其源代码转换成两个文件。@MarkSetchell-请举例说明将其源代码转换成两个文件是什么意思/a、 sh>/dev/null
?在bash中,可以通过查看${bash_SOURCE[@]}
的值来检查这一点。对ksh不太确定——ksh和ksh版本之间有很大差异。你能指定你使用的是哪一个吗?@charlesduff-你是说${#BASH_SOURCE[a.sh]}???usr/bin/kshPuta()
单独放在一个文件中,并将其源代码转换成两个文件。@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