Answers:
如果脚本仅定义函数,而没有执行其他任何操作,则可以先使用source
or .
命令在当前shell的上下文中执行脚本,然后简单地调用函数。请参阅help source
以获取更多信息。
bash
),并且exit
只会终止该子外壳程序,而不会终止您的终端。
好吧,尽管其他答案是正确的-您当然可以做其他事情:如果您有权访问bash脚本,则可以对其进行修改,然后只需在特殊参数的末尾放置特殊参数"$@"
-该特殊参数将扩展为命令行的参数您指定,并且由于它是“单独的”,shell将尝试逐字称呼它们;在这里您可以将函数名称指定为第一个参数。例:
$ cat test.sh
testA() {
echo "TEST A $1";
}
testB() {
echo "TEST B $2";
}
"$@"
$ bash test.sh
$ bash test.sh testA
TEST A
$ bash test.sh testA arg1 arg2
TEST A arg1
$ bash test.sh testB arg1 arg2
TEST B arg2
为了进行润色,您可以首先验证该命令是否存在并且是一个函数:
# Check if the function exists (bash specific)
if declare -f "$1" > /dev/null
then
# call arguments verbatim
"$@"
else
# Show a helpful error
echo "'$1' is not a known function name" >&2
exit 1
fi
"$@"
在大多数情况下使用。$@
在某些情况下不安全。
bash test.sh testA testB
吗?
[ ! -z "$1" ]
其他方式包装,否则源代码将在某些bash版本中引发else语句
以下命令首先在上下文中注册该函数,然后调用它:
. ./myScript.sh && function_name
使用 case
#!/bin/bash
fun1 () {
echo "run function1"
[[ "$@" ]] && echo "options: $@"
}
fun2 () {
echo "run function2"
[[ "$@" ]] && echo "options: $@"
}
case $1 in
fun1) "$@"; exit;;
fun2) "$@"; exit;;
esac
fun1
fun2
该脚本将运行fun1和fun2函数,但是如果您使用fun1或fun2选项启动它,则它将仅运行带有args(如果提供)的给定函数并退出。用法
$ ./test
run function1
run function2
$ ./test fun2 a b c
run function2
options: a b c
编辑:警告-似乎这并非在所有情况下都有效,但在许多公共脚本上都能很好地工作。
如果您有一个名为“ control”的bash脚本,并且其中包含一个名为“ build”的函数:
function build() {
...
}
然后,您可以这样调用它(从它所在的目录):
./control build
如果在另一个文件夹中,则可以:
another_folder/control build
如果您的文件名为“ control.sh”,则将相应地使函数可调用,如下所示:
./control.sh build
. ./control.sh && build
exit
在函数中使用它,则在执行函数后它将关闭终端。有没有办法解决?@SvenMarnach