能否在进程替换(process substitution)中使用括号扩展(brace expansion)
结论
你尝试的写法不可行。
报错原因
你对括号扩展的作用范围理解有误:
- 你写的
<(cat {a,b}/somefile)中,{a,b}属于进程替换内部cat命令的参数,仅会扩展为cat a/somefile b/somefile,最终整个进程替换只会输出两个文件拼接后的内容,相当于你仅给comm传入了1个输入流,自然会触发缺少第二个操作数的报错。 - 括号扩展不会自动拆分生成两个独立的
<(...)进程替换结构,因为<(...)本身是一个完整的语法单元,括号扩展不会跨越这个单元的边界生成多份进程替换语法。
替代方案(避免重复写长命令)
你可以通过以下方式实现需求,无需重复编写复杂命令:
- 将长命令存入变量/数组(最稳妥,无安全风险)
# 命令简单时用普通变量 long_cmd="你的复杂长命令" comm -23 <($long_cmd a/somefile) <($long_cmd b/somefile) # 命令包含多参数、特殊符号时用数组更安全 long_cmd=(你的 复杂长命令 --带多个 参数 --特殊选项) comm -23 <("${long_cmd[@]}" a/somefile) <("${long_cmd[@]}" b/somefile)
- 配合printf和eval动态生成(适合路径批量扩展的场景,需确保文件名无特殊字符)
eval comm -23 $(printf '<(你的复杂长命令 %s) ' {a,b}/somefile)
内容的提问来源于stack exchange,提问作者chx
相关产品推荐
相关产品推荐

