bash脚本执行报`syntax error near unexpected token `('`错误,是否因缺少#!/bin/bash?
问题解答
是的,这个语法错误确实是因为脚本缺少#!/bin/bash开头导致的,具体原因和解决方案如下:
为什么会报错?
当你用sh test.sh执行脚本时,系统会调用POSIX标准的Shell(很多Linux发行版里sh其实是dash,一个轻量的POSIX兼容Shell)来运行脚本。而你用到的<(command)语法叫做进程替换(process substitution),这是Bash的专属扩展特性,并不属于POSIX Shell的标准语法。POSIX Shell无法识别<(这个语法结构,所以会抛出syntax error near unexpected token '('的错误。
解决方案
你有两种方式解决这个问题:
1. 给脚本添加Bash Shebang
在脚本的第一行添加#!/bin/bash,明确指定用Bash来执行这个脚本:
#!/bin/bash echo -e 'Gene_id\tsample_1\tsample_2\tsample_3' > control.countmerged.idx paste <(awk -F'"' '{print $2}' 1.countmerged.idx) <(awk -F'"' '{print $6}' 1.countmerged.idx) <(awk -F'"' '{print $6}' 2.countmerged.idx) <(awk -F'"' '{print $6}' 3.countmerged.idx) >> control.countmerged.idx
添加后,即使你用sh test.sh执行(部分系统会优先识别Shebang),或者直接赋予执行权限后运行./test.sh,都会用Bash来处理脚本,支持进程替换语法。
2. 直接用Bash命令执行脚本
不需要修改脚本,直接用bash test.sh代替sh test.sh来运行,这样系统会调用Bash来解析脚本,自然就能识别进程替换的语法了。
内容的提问来源于stack exchange,提问作者Xiaokang
相关产品推荐
相关产品推荐

