如何在命令行中通过脚本运行函数?
我有一个脚本,有一些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