使用watch执行含paste进程替换命令时报“(”语法错误如何解决?
报错原因
watch 默认使用 POSIX 标准的 sh 解析执行传入的命令,而 <(...) 属于 Bash/Zsh 等进阶 Shell 独有的进程替换语法,sh 不支持该特性,因此会触发括号语法错误。你手动转义括号也无效的原因是转义后进程替换语法本身就失效了,依然无法达到预期效果。
解决方案
方案1:通用方案(适配所有需要进程替换的场景)
显式指定用 Bash 来执行你的命令,写法如下:
watch 'bash -c "paste <(cat log1.dat) <(cat log2.dat)"'
也可以用 watch 的 -x 参数直接执行 Bash 命令,避免嵌套引号容易出错的问题:
watch -x bash -c 'paste <(cat log1.dat) <(cat log2.dat)'
方案2:当前场景简化方案
你当前的写法里 paste <(cat log1.dat) <(cat log2.dat) 完全可以简化为直接把文件路径传给 paste,不需要用到进程替换,也就不会触发 Shell 兼容问题:
watch 'paste log1.dat log2.dat'
该写法不需要依赖 Bash 特性,sh 可以直接正常执行,是当前场景下最优的写法。
内容的提问来源于stack exchange,提问作者Caio
相关产品推荐
相关产品推荐

