为何调用带<>参数的导出Bash函数时GNU parallel会报文件不存在?
问题分析与解决
错误原因
直接调用doit "<xxx>"时,当前Shell会将双引号包裹的<xxx>作为完整字符串参数传递给函数,不会解析其中的<符号。但用GNU parallel调用时,parallel会启动子Shell执行导出的函数,此时<xxx>会被子Shell当成输入重定向命令,试图读取名为xxx的文件——而这个文件不存在,因此抛出“找不到文件”的错误。
解决方法
有三种可靠的方式避免这个问题:
- 用单引号包裹参数,彻底阻止Shell解析特殊符号:
doit () { echo $1; } ; export -f doit ; parallel doit '<xxx>' ::: 1 - 使用parallel的
--quote选项,让它自动对参数转义:doit () { echo $1; } ; export -f doit ; parallel --quote doit "<xxx>" ::: 1 - 将参数放到
:::后面作为输入源,用{}占位并包裹单引号:doit () { echo $1; } ; export -f doit ; parallel doit '{}' ::: "<xxx>"
内容的提问来源于stack exchange,提问作者pmor
相关产品推荐
相关产品推荐

