如何让GNU Parallel正确解析带引号的命令行参数?
让GNU Parallel shebang脚本正确处理带空格的引号参数
问题重现
你使用GNU Parallel的shebang脚本时,遇到了带空格的引号参数被错误拆分的问题:
错误示例脚本
#!/usr/bin/parallel --shebang-wrap --colsep " " /bin/bash echo Arguments: $@
执行命令:
./bash_echo.parl gracias 'buenos dias'
错误输出:
gracias buenos dias
这里'buenos dias'被拆分成了两个独立参数,而预期的正确输出应该和下面的普通bash脚本一致:
预期效果的bash脚本
#!/usr/bin/env bash for i in "$@"; do echo "$i" done
执行相同命令后的正确输出:
gracias buenos dias
解决方法
问题根源在于你使用了--colsep " "选项,它会将所有输入参数按空格强制拆分,破坏了引号参数的完整性。你需要调整Parallel的shebang参数,让它正确保留参数的原始结构:
方法1:逐参数处理
如果只需要逐个输出每个参数(和预期脚本效果一致),可以去掉--colsep选项,直接让Parallel把每个命令行参数作为独立任务处理:
#!/usr/bin/parallel --shebang-wrap /bin/bash echo "$1"
执行同样的命令./bash_echo.parl gracias 'buenos dias',就能得到正确输出:
gracias buenos dias
方法2:完整传递所有参数
如果你需要在脚本中完整处理所有参数(比如遍历、批量操作),可以添加-N0选项,让Parallel将所有命令行参数作为一个整体传递给bash脚本:
#!/usr/bin/parallel --shebang-wrap -N0 /bin/bash for i in "$@"; do echo "$i" done
执行后同样会输出预期的结果,这种方式更贴近普通bash脚本的参数处理逻辑。
原理说明
--shebang-wrap让Parallel将脚本内容作为命令模板,处理后续的命令行参数- 去掉
--colsep避免了参数被强制拆分,保留了引号包裹的空格参数的完整性 -N0参数告诉Parallel不要拆分输入参数,而是将所有参数一次性传递给脚本执行
内容的提问来源于stack exchange,提问作者Linus Fernandes
相关产品推荐
相关产品推荐

