gpt4 book ai didi

bash - 使用 xargs 调用 shell 函数

转载 作者:行者123 更新时间:2023-11-29 09:32:48 28 4
gpt4 key购买 nike

我正在尝试使用 xargs 并行调用更复杂的函数。

#!/bin/bash
echo_var(){
echo $1
return 0
}
seq -f "n%04g" 1 100 |xargs -n 1 -P 10 -i echo_var {}
exit 0

这会返回错误

xargs: echo_var: No such file or directory

欢迎任何关于我如何使用 xargs 来完成此任务的想法,或任何其他解决方案。

最佳答案

导出函数应该可以(未测试):

export -f echo_var
seq -f "n%04g" 1 100 | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}

您可以使用内置的 printf 而不是外部的 seq:

printf "n%04g\n" {1..100} | xargs -n 1 -P 10 -I {} bash -c 'echo_var "$@"' _ {}

另外,像这样使用 return 0exit 0 可以掩盖任何可能由它前面的命令产生的错误值。此外,如果没有错误,它就是默认值,因此有些多余。

@phobic 提到 Bash 命令可以简化为

bash -c 'echo_var "{}"'

直接在其中移动 {}但是正如@Sasha 所指出的,它容易受到命令注入(inject)的影响。

以下是您不应使用嵌入格式的示例:

$ echo '$(date)' | xargs -I {} bash -c 'echo_var "{}"'
Sun Aug 18 11:56:45 CDT 2019

为什么不的另一个例子:

echo '\"; date\"' | xargs -I {} bash -c 'echo_var "{}"'

这是使用安全格式的输出:

$ echo '$(date)' | xargs -I {} bash -c 'echo_var "$@"' _ {}
$(date)

这相当于使用 parameterized SQL queries避免 injection .

我在这里的命令替换或转义引号中使用 date 而不是 Sasha 评论中使用的 rm 命令,因为它是非破坏性的。

关于bash - 使用 xargs 调用 shell 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31735780/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com