MacOS下遍历MotifsList.txt运行fimo的bash脚本报bad interpreter错如何解决
问题原因
- 报错
zsh: ./file.sh: bad interpreter: /bin/bash^M: no such file or directory的直接原因:你的脚本使用了Windows格式的换行符(CRLF,\r\n),而MacOS/Linux系统默认识别Unix格式换行符(LF,\n),shebang行末尾多余的\r(即报错信息里的^M)导致系统无法匹配到正确的bash解释器路径。 - 脚本还存在3个逻辑问题:
- 结果文件重定向用了
>,每次循环都会覆盖之前的输出,最终只会保留最后一个Motif的运行结果 - 你描述中提到的参考序列文件名为
file.fa,但脚本里写的是genome.fa,会导致fimo找不到输入序列报错 $line变量没有加引号,Motif名称里如果有空格(比如示例中的MOTIF MA0151.1 Arid3a)会被shell拆分为多个参数,导致--motif传入值错误
解决步骤
1. 修复换行符问题
两种方案二选一即可:
- 方法1:先通过Homebrew安装dos2unix工具:
brew install dos2unix,再执行转换:dos2unix file.sh - 方法2:直接用sed命令替换换行符:
sed -i '' 's/\r$//' file.sh(MacOS的sed需要额外加空的''参数)
2. 修复脚本逻辑错误
修改后的file.sh内容如下:
#!/bin/bash # 启动循环前先清空结果文件,避免多次运行重复累加内容 > ResultFile while IFS= read -r line || [[ -n $line ]]; do fimo --thresh 1e-4 --no-qvalue --max-stored-scores 10000000 --motif "$line" --text file.meme file.fa >> ResultFile done < "$1"
改动说明:
- 给
$line和输入参数$1加了双引号,避免空格拆分参数 - 把结果重定向符从
>改为>>,追加写入所有Motif的运行结果 - 把错误的输入序列文件名
genome.fa改为实际的file.fa
3. 重新执行脚本
使用你原本的启动命令即可:
cd /Users/myho2345/Desktop/Motifs_analysis chmod +x file.sh ./file.sh MotifsList.txt
内容的提问来源于stack exchange,提问作者Myke
相关产品推荐
相关产品推荐

