UNIX join命令嵌入sort到Shell脚本执行报语法错误求助
解决Shell脚本中join命令进程替换的语法错误问题
这个问题的核心原因很明确:你用到的<(sort file)这种进程替换语法是Bash的专属特性,而如果你的脚本被非Bash的Shell(比如Dash,很多Linux发行版里sh默认指向它)执行的话,就会抛出语法错误。命令行里能正常运行是因为你当前用的是Bash,但脚本执行时可能没走Bash。
下面给你几个靠谱的解决方案:
方案1:确保脚本用Bash执行
这是最直接的修复方式,因为你的脚本开头已经写了#!/bin/bash,只要保证脚本以正确的方式运行即可:
- 先给脚本添加执行权限:
chmod +x join.sh - 直接运行脚本(系统会通过开头的
#!/bin/bash调用Bash来执行):
注意不要用./join.shsh join.sh来运行,这会强制用sh(可能是Dash)执行,从而触发语法错误。
方案2:改用兼容POSIX Shell的写法(不依赖进程替换)
如果你的脚本需要在更通用的Shell环境下运行,可以先把文件排序到临时文件里,再执行join:
#!/bin/sh # 先排序文件到临时文件(用进程ID做后缀避免重名) sort file1 > /tmp/sorted_file1.$$ sort file2 > /tmp/sorted_file2.$$ # 执行join对比 join -v 2 /tmp/sorted_file1.$$ /tmp/sorted_file2.$$ > difference.file # 清理临时文件 rm /tmp/sorted_file1.$$ /tmp/sorted_file2.$$
额外提示
你可以通过echo $SHELL查看当前命令行用的Shell,通过ls -l /bin/sh查看系统里sh指向的是哪个Shell(比如Ubuntu默认是Dash)。尽量避免依赖sh支持Bash特性的情况,保持脚本的兼容性。
内容的提问来源于stack exchange,提问作者fsl2050
相关产品推荐
相关产品推荐

