如何在命令行中通过脚本运行函数?

我有一个脚本,有一些function。

我可以直接从命令行运行一个函数吗?

像这样的东西?

myScript.sh func() 

如果脚本只定义了这些函数,而且什么都不做,那么可以先使用source或者在当前shell的上下文中执行脚本. 命令,然后简单地调用该函数。 请参阅help source了解更多信息。

那么,其他答案是正确的 – 你可以做一些其他的事情:如果你有权访问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 

波兰语,你可以先validation命令是否存在,并且是一个函数:

 # 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 

下面的命令首先在上下文中注册函数,然后调用它:

 . ./myScript.sh && func() 

简而言之,不。

您可以将脚本中的所有function导入到具有source (详情请参阅help source )的环境中,然后您可以调用它们。 这也有执行脚本的效果,所以要小心。

没有办法从shell脚本中调用一个函数,就像它是一个共享库一样。

编辑:警告 – 似乎这并不适用于所有情况,但在许多公共脚本上运行良好。

如果你有一个名为“control”的bash脚本,并且里面有一个叫做“build”的函数:

 function build() { ... } 

那么你可以这样调用它(从它所在的目录):

 ./control build 

如果它在另一个文件夹中,则会使其成为:

 another_folder/control build 

如果你的文件被称为“control.sh”,那么相应地使这个函数可以这样调用:

 ./control.sh build 

我有一个情况,我需要从bash脚本不能执行之前(例如由source )和@$的问题是,myScript.sh然后运行两次,似乎…所以我来了与想法得到与sed的function:

sed -n "/^func ()/,/^}/p" myScript.sh

为了在需要的时候执行它,我把它放在一个文件中,并使用source

sed -n "/^func ()/,/^}/p" myScript.sh > func.sh; source func.sh; rm func.sh