2013-05-13 135 views
15

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

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

#! /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 

该系列里grep的只是拉出DNA序列数据为每个站点每个位点到新的文本文件。 Samples ... txt文件具有站点的示例ID号,.fasta文件具有按样本ID组织的序列信息;如果我单独运行,grep在命令行中工作得很好。

第二组代码创建了我需要结束的实际新文件,该文件以.mig结尾。回波线是关于计划需要信息的计数(每个基因座的碱基对,分析中的群体,每个位点的样本等)的数据。猫线将按照回声线指定的特定站点信息下的所有灰线所创建的站点数据将轨迹混合在一起。你毫无疑问得到了图片。

为了创建shell脚本,我一直在Excel中启动,因此我可以轻松地复制粘贴/自动填充单元格,保存为制表符分隔文本,然后在TextWrangler中打开该文本文件以在保存之前移除制表符。 sh文件(换行符:Unix(LF)和Encoding: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 

我已经在这个impass两天了,所以任何输入将不胜感激!谢谢!!

+3

''MigrateNshell.sh'在'PATH'中的位置?如果试图从当前目录运行它,请尝试使用'./MigrateNshell.sh'。 – 2013-05-13 19:30:14

回答

1
#! /bin/bash 
    ^--- 

删除指定的空间。该家当应

#!/bin/bash 
+6

hashbang后通常会容忍一个空格。 – chepner 2013-05-13 19:53:54

+0

另请参阅[这个答案](http://stackoverflow.com/a/10197964/3266847)。 – 2017-03-04 07:25:08

28

出于安全原因,外壳不会搜索可执行文件的当前目录(默认情况下)。你必须要具体,并告诉bash你的脚本是在当前目录(.):

$ ./MigrateNshell.sh 
+0

+1我认为这将是原因。 – Kent 2013-05-13 19:57:14

+2

您也可以指定解释器:'bash MigrateNshell.sh'。即使没有执行权限,这也能工作 – Otaia 2013-05-13 20:21:35

-3

第一:

chmod 777 ./MigrateNshell.sh 

然后:

./MigrateNshell.sh 

或者,添加您的编程到您的$ PATH变量中可识别的目录。例如:Path Variable Example 那么这将允许你打电话给你的程序,而不./

+4

制作'chmod 755',而不是'chmod 777'。 '777'为系统上的每个人提供写入权限。 '755'给你完全的许可,但只能阅读并执行给其他人。 – 2013-06-28 21:35:41

1

Unix有一个名为PATH变量,目录在哪里可以找到命令的列表。

$ echo $PATH 
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/david/bin 

如果我在命令行命令foo,我的壳会先看看有没有可执行命令/usr/local/bin/foo。如果有,它将执行/usr/local/bin/foo。如果没有,它会查看是否有可执行命令/usr/bin/foo,如果不存在,它将查看/bin/foo是否存在等,直到它到达/Users/david/bin/foo

如果它在任何这些目录中找不到命令foo,它告诉我命令未找到

有几种方法,我可以处理这个问题:

  • 使用命令bash foo因为foo是一个shell脚本。
  • 当您执行命令如/Users/david/foo$PWD/foo或只是普通./foo时,请包含目录名称。
  • 更改您的$PATH变量以将包含您的命令的目录添加到PATH。

您可以修改$HOME/.bash_profile$HOME/.profile如果.bash_profile不存在。我这样做是为了添加我首先放在我的路径上的/usr/local/bin。这样,我可以覆盖OS中的标准命令。例如,我有Ant 1.9.1,但Mac带有Ant 1.8.4。我把我的ant命令放在/usr/local/bin,所以我的版本ant会先执行。我还为我自己的命令添加了$HOME/bin到PATH的末尾。如果我有一个你想执行的文件,我将它放在$ HOME/bin中执行它。

14

变化的第一行到下面的如由Marc乙指出

#!/bin/bash 

然后标记的脚本执行,因此从命令行执行它

chmod +x MigrateNshell.sh 
./MigrateNshell.sh 

或简单地从执行的bash命令行传入脚本作为参数

/bin/bash MigrateNshell.sh 
0

另请确保/ bin/bash是bash的适当位置....如果你从某个示例中取出该行,它可能与您的特定服务器不匹配。如果你正在为bash指定一个无效位置,你将会遇到问题。

7

也尝试到dos2unix shell脚本,因为它有时具有Windows行结束,并且shell不能识别它。

$ dos2unix MigrateNshell.sh 

这有助于有时。

+0

这为我解决了它。在这种情况下,我可以通过在vi中注意添加到每行的^ M来看到问题(在这个答案提示它之后)。奇怪的gvim认为它已经是Unix格式,所以它一定是一行结尾错误。 – lessthanideal 2015-05-12 16:54:37

+0

我到处寻找忘记我已经在Windows中编辑了文件! – Omar 2016-01-28 04:39:34

0

在你的下面添加下面几行。配置文件路径

PATH=$PATH:$HOME/bin:$Dir_where_script_exists 

export PATH 

现在你的脚本应该没有./

拉吉Dagla

2

有许多关于添加shebang line到脚本的开头几个很好的意见。我想添加一个建议,以便使用env command以提高便携性。

虽然#!/bin/bash可能是您的系统上的正确位置,但这不是通用的。此外,这可能不是用户的首选 bash。 #!/usr/bin/env bash将选择在路径中找到的第一个bash。

9

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

1

尝试chmod u+x MigrateNshell.sh