您的问题仅涉及导出功能。这在 bash 中很容易,见下文。
您的问题标题/主题暗示在 xargs 中使用函数,就好像它们是脚本一样;我不知道 xargs 可以直接“调用” bash 函数,但您当然可以将导出函数的使用包装在由 调用的脚本中xargs
,见下文。
首先,列出函数的函数。默认用户函数和 -v 列出所有函数:
lsfns () {
case "$1" in
-v | v*)
# verbose:
set | grep '()' --color=always
;;
*)
declare -F | cut -d" " -f3 | egrep -v "^_"
;;
esac
}
接下来是导出所有用户功能的功能:
exportfns () { export -f $(lsfns); }
或者只是放入export -f $(lsfns)
你的.bashrc
.
示例脚本 doit.sh:
#!/bin/bash
lsfns "$@" # make use of function exported by parent shell :)
命令行示例(在 之后chmod a+rx doit.sh
):
echo -v | xargs doit.sh
与之比较
echo "" | xargs doit.sh
编辑1:进一步回应下面的kdb评论/答案(“遇到导出功能根本不起作用的情况”):
shell 函数的导出与 Posix 不兼容 - 即它仅适用于 Bash 以及可能的其他 shell,例如 Zsh、Ksh 等。
也就是说,在 Dash 和不提供“export -f”的“标准”Posix shell 中,我们无法导出函数,并且如果我们在 Bash 中导出函数,则运行以 sh-bang 开头的脚本,例如“#! /bin/dash”,该脚本将无法使用父 shell 中的“导出”函数,因为 Dash 无法识别通过 Bash 导出到“进程环境”的函数。
编辑 2:进一步回应 OP 评论“但如果myfunction
依赖于其他功能,这将变得难以维护”:
这可能是一种可以充分利用 shellsource
命令(别名“.”)的情况,例如:
. ~/etc/my-functions.sh; myMain ...
同样,如果您“生活”在函数中而不是脚本文件中,例如通过myMain
在需要时调用,那么该函数的第一行可以为您的函数库提供源代码;
因为在“定期运行脚本”的情况下这将是额外的开销,所以myMain
成为命令行存根函数,它(重新)加载您的函数库,并调用该actuallyDoit
函数(如果您也可以从脚本内部调用该函数)有一个脚本文件)。
享受
泽南