我遇到了在bash脚本中调用xargs以并行化函数启动的问题。
我有这样一句话:
grep -Ev '^#|^$' "$listOfTables" | xargs -d '\n' -l1 -I args -P"$parallels" bash -c "doSqoop 'args'"这将启动我之前导出的函数doSqoop。
我先传递给xargs,然后传递给bash -c一个非常长的行,其中包含我在函数中拆分和处理的字段。
它类似于我通过上面的grep命令从文件中读取的schema|tab|dest|desttab|query|splits|....。我对这个解决方案很满意,我知道xargs可以在|上拆分,但是我可以这样做。
它以前工作得很好,因为我必须在末尾添加另一个字段,其中包含这样的值:
field1='varchar(12)',field2='varchar(4)',field3='timestamp',....
现在我有了这个错误:bash: -c: line 0: syntax error near unexpected token '('
我试着逃脱穿刺术和单引号,但没有成功。
在我看来,bash -c正在解释这些论点
发布于 2017-05-06 21:26:01
使用GNU并行,它可以调用导出的函数,并且语法更简单,功能更多。
您的示例命令应该替换为
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" doSqoophttps://stackoverflow.com/questions/43820191
复制相似问题