gpt4 book ai didi

linux - xargs bash -c 意外标记

转载 作者:太空狗 更新时间:2023-10-29 12:25:11 25 4
gpt4 key购买 nike

我在 bash 脚本中调用 xargs 以并行启动函数时遇到问题。

我有这一行:

grep -Ev '^#|^$' "$listOfTables" | xargs -d '\n' -l1 -I args -P"$parallels" bash -c "doSqoop 'args'"

启动我之前导出的函数 doSqoop
我传递给 xargs 然后传递给 bash -c 一个很长的行,包含我在函数内部拆分和处理的字段。
它类似于 schema|tab|dest|desttab|query|splits|.... 我通过上面的 grep 命令从文件中读取的内容。我对这个解决方案很好,我知道 xargs 可以在 | 上拆分行,但我可以这样。

它过去工作得很好,因为我不得不在末尾添加另一个字段,其中包含这种值:

field1='varchar(12)',field2='varchar(4)',field3='timestamp',....

现在我有这个错误:bash: -c: line 0: unexpected token '(' 附近的语法错误

我试图转义单引号和单引号,但没有成功。
在我看来 bash -c 正在解释参数

最佳答案

使用可以调用导出函数的 GNU parallel,语法更简单,功能更多。

您的示例命令可以替换为

grep -Ev '^#|^$' file | parallel doSqoop

用下面的脚本测试:

#!/bin/bash
doSqoop() {
printf "%s\n" "$@"
}
export -f doSqoop
grep -Ev '^#|^$' file | parallel doSqoop

您还可以使用 -P 选项设置进程数,否则它会匹配您系统中的核心数:

grep -Ev '^#|^$' file | parallel -P "$num" doSqoop

关于linux - xargs bash -c 意外标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43820191/

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