Shell脚本未运行,找不到命令

Chi*_*ick 23 unix bash shell scripting

我是非常非常新的UNIX编程(通过终端在MacOSX Mountain Lion上运行).我一直在学习生物信息学和分子方法课程的基础知识(我们有两个类),我们最终将使用perl和python进行数据管理.无论如何,我们的任务是编写一个shell脚本来从一组文件中获取数据,并将其写入一个可由特定程序(Migrate-N)读取的格式的新文件.

当我在命令行中键入它们时,我已经获得了许多功能来完全独立完成我的需要,但是当我将它们全部放在一个脚本中并尝试运行它时,我得到一个错误.以下是详细信息(我为长度道歉):

#! /bin/bash

grep -f Samples.NFCup.txt locus1.fasta > locus1.NFCup.txt
grep -f Samples.NFCup.txt locus2.fasta > locus2.NFCup.txt
grep -f Samples.NFCup.txt locus3.fasta > locus3.NFCup.txt
grep -f Samples.NFCup.txt locus4.fasta > locus4.NFCup.txt
grep -f Samples.NFCup.txt locus5.fasta > locus5.NFCup.txt
grep -f Samples.Salmon.txt locus1.fasta > locus1.Salmon.txt
grep -f Samples.Salmon.txt locus2.fasta > locus2.Salmon.txt
grep -f Samples.Salmon.txt locus3.fasta > locus3.Salmon.txt
grep -f Samples.Salmon.txt locus4.fasta > locus4.Salmon.txt
grep -f Samples.Salmon.txt locus5.fasta > locus5.Salmon.txt
grep -f Samples.Cascades.txt locus1.fasta > locus1.Cascades.txt
grep -f Samples.Cascades.txt locus2.fasta > locus2.Cascades.txt
grep -f Samples.Cascades.txt locus3.fasta > locus3.Cascades.txt
grep -f Samples.Cascades.txt locus4.fasta > locus4.Cascades.txt
grep -f Samples.Cascades.txt locus5.fasta > locus5.Cascades.txt

echo 3 5 Salex_melanopsis > Smelanopsis.mig
echo 656 708 847 1159 779 >> Smelanopsis.mig
echo 154 124 120 74 126 NFCup >> Smelanopsis.mig
cat locus1.NFCup.txt locus2.NFCup.txt locus3.NFCup.txt locus4.NFCup.txt locus5.NFCup.txt >> Smelanopsis.mig
echo 32 30 30 18 38 Salmon River >> Smelanopsis.mig
cat locus1.Salmon.txt locus2.Salmon.txt locus3.Salmon.txt locus4.Salmon.txt locus5.Salmon.txt >> Smelanopsis.mig
echo 56 52 24 29 48 Cascades >> Smelanopsis.mig
cat locus1.Cascades.txt locus2.Cascades.txt locus3.Cascades.txt locus4.Cascades.txt locus5.Cascades.txt >> Smelanopsis.mig
Run Code Online (Sandbox Code Playgroud)

greps系列只是将每个基因座的DNA序列数据拉出到新的文本文件中.Samples ... txt文件具有站点的样本ID号,.fasta文件具有按样本ID组织的序列信息; 如果我单独运行它,grepping在命令行中工作得很好.

第二组代码创建了我最终需要的实际新文件,以.mig结尾.回波线是关于计数需要信息的计数(每个基因座的碱基对,分析中的群体,每个位点的样品等)的数据.猫行将通过由回声线中指定的站点特定信息下方的所有grepping创建的站点数据将基因座混合在一起.你无疑得到了这张照片.

为了创建shell脚本,我一直在Excel中启动,因此我可以轻松地复制粘贴/自动填充单元格,保存为制表符分隔文本,然后在TextWrangler中打开该文本文件以删除选项卡,然后保存为.sh文件(行中断:Unix(LF)和编码:Unicode(UTF-8))与脚本中使用的所有文件位于同一目录中.我尝试过使用chmod +x FILENAME.shchmod u+x FILENAME.sh尝试确保它是可执行的,但无济于事.即使我将脚本缩减到一个grep行(使用#!/ bin/bash第一行),我也无法使其工作.当我直接在命令行中输入该过程时,该过程只需要片刻,因为这些文件都不大于160KB而有些文件要小得多.这是我输入的内容以及我尝试运行文件时获得的内容(HW是正确的目录)

localhost:HW Mirel$ MigrateNshell.sh
-bash: MigrateNshell.sh: command not found
Run Code Online (Sandbox Code Playgroud)

我已经在这个问题上呆了两天了,所以任何意见都会非常感激!谢谢!!

che*_*ner 32

出于安全原因,shell不会搜索当前目录(默认情况下)以查找可执行文件.您必须具体,并告诉bash您的脚本在当前目录(.)中:

$ ./MigrateNshell.sh
Run Code Online (Sandbox Code Playgroud)

  • 您还可以指定解释器:`bash MigrateNshell.sh`.即使没有执行权限,这也可以. (2认同)

Rya*_*ams 18

如Marc B所指出的,将第一行更改为以下内容

#!/bin/bash 
Run Code Online (Sandbox Code Playgroud)

然后将脚本标记为可执行文件并从命令行执行它

chmod +x MigrateNshell.sh
./MigrateNshell.sh
Run Code Online (Sandbox Code Playgroud)

或者只是从命令行执行bash作为参数传入脚本

/bin/bash MigrateNshell.sh
Run Code Online (Sandbox Code Playgroud)


小智 9

也尝试dos2unix使用shell脚本,因为有时候它有Windows行结尾而shell无法识别它.

$ dos2unix MigrateNshell.sh
Run Code Online (Sandbox Code Playgroud)

这有时有帮助.


小智 9

确保您没有使用"PATH"作为变量,它将覆盖环境变量的现有PATH.

  • 太蠢了,你竟然把你头像上的相机对着我,给这样的白痴拍照:| (2认同)

Mar*_*c B 3

#! /bin/bash
  ^---
Run Code Online (Sandbox Code Playgroud)

删除指定的空间。舍邦应该是

#!/bin/bash
Run Code Online (Sandbox Code Playgroud)

  • 在 hashbang 之后通常可以容忍空格。 (8认同)