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/bashchmod +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
相关产品推荐
相关产品推荐

