首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xargs bash -c意外内标识

xargs bash -c意外内标识
EN

Stack Overflow用户
提问于 2017-05-06 19:59:57
回答 1查看 381关注 0票数 2

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

我有这样一句话:

代码语言:javascript
复制
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正在解释这些论点

EN

回答 1

Stack Overflow用户

发布于 2017-05-06 21:26:01

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

您的示例命令应该替换为

代码语言:javascript
复制
grep -Ev '^#|^$' file | parallel doSqoop

使用以下脚本进行测试:

代码语言:javascript
复制
#!/bin/bash
doSqoop() {
  printf "%s\n" "$@"
}
export -f doSqoop
grep -Ev '^#|^$' file | parallel doSqoop

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

代码语言:javascript
复制
grep -Ev '^#|^$' file | parallel -P "$num" doSqoop
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43820191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档