linux - xargs bash -c 意外标记

标签 linux bash shell xargs

我在 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/

相关文章:

linux - 仅为我自己禁用和重新启用地址空间布局随机化

bash - 在环境变量中捕获 curl header 和响应

bash - 管道时何时使用 xargs?

regex - Bash 正则表达式匹配不起作用

Cygwin 和 Netbeans : run on default Windows shell?

c - 将结构传递给回调函数

C# 从 Windows 写入 ext2 linux 分区

linux - 如何在执行 vertica 查询时在 shell 脚本中打印错误?

linux - bash中的 ">"和 "&>"有什么区别?

linux - 如何在 sudo 命令后执行多个命令