You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unix Shell脚本使用comm命令对比文件报错:syntax error near unexpected token `('

解决Shell脚本中comm命令进程替换的语法错误问题

这个问题我太熟悉了!你遇到的syntax error near unexpected token '(',核心原因是你当前使用的Shell不支持进程替换语法<(...)——比如如果是用sh(而不是bash)来执行脚本,就会触发这个错误,因为进程替换是bash、zsh等现代Shell才支持的特性。

快速解决方案:切换到Bash执行

有两种方式确保用支持的Shell运行:

  • 在脚本开头添加Shebang声明:
    #!/bin/bash
    
    然后给脚本加执行权限:chmod +x your_script.sh,再运行./your_script.sh。
  • 直接用Bash调用脚本:
    bash your_script.sh
    

修正后的完整命令

确认用Bash后,你的原命令逻辑是对的,只要替换成实际文件路径即可:

comm -2 -3 <(sort ./file1) <(sort ./file2) > ./file3

解释下各参数:

  • -2 -3:告诉comm不要显示file2独有的行(-2)和两者共有的行(-3),只保留file1独有的内容。
  • 排序是因为comm要求输入文件必须是已排序的,否则结果会不准确。

兼容老式Shell的替代方案(不用进程替换)

如果你的环境只能用sh这类不支持进程替换的Shell,可以先用临时文件存储排序后的内容:

# 先排序两个文件到临时文件
sort ./file1 > temp_file1.txt
sort ./file2 > temp_file2.txt

# 对比并输出差异到file3
comm -2 -3 temp_file1.txt temp_file2.txt > ./file3

# 清理临时文件
rm temp_file1.txt temp_file2.txt

验证结果

执行后file3的内容应该是:

B
D

完全符合你的预期,因为file1排序后是A B C D,file2排序后是A C,两者差异就是B和D。

内容的提问来源于stack exchange,提问作者mesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:31:26