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