向GNU parallel传递空参数不生效是什么原因?如何解决?
问题原因
GNU Parallel 默认的参数解析逻辑会自动剔除待执行命令部分传入的空字符串参数,你定义的args数组中第二个空元素在传递给Parallel时直接被丢弃,原本的参数序列doit a 空字符串 {}被裁剪为doit a {},后续从标准输入读取的1、2就顺移到了第二个参数位,最终出现参数错位的输出结果。
修复方案
- 方案1:添加
-q参数强制保留原始参数引用-q参数会要求Parallel不对后续传入的命令和参数做额外的拆分、剔除处理,原样传递给执行环境,修改后的命令如下:
echo -e "1\n2" | parallel -k -q "doit" "${args[@]}" {}
- 方案2:显式包裹参数传递逻辑
将执行逻辑包裹在单引号内,用$@统一接收后续所有参数,避免空参数被提前解析过滤:
echo -e "1\n2" | parallel -k 'doit "$@"' _ "${args[@]}" {}
两种方案执行后均可得到预期输出。
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

