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

时间:2013-05-13 19:27:17

标签: bash shell unix 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

一系列的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

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

12 个答案:

答案 0 :(得分:32)

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

$ ./MigrateNshell.sh

答案 1 :(得分:17)

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

#!/bin/bash 

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

chmod +x MigrateNshell.sh
./MigrateNshell.sh

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

/bin/bash MigrateNshell.sh

答案 2 :(得分:9)

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

答案 3 :(得分:8)

还尝试dos2unix shell脚本,因为有时候它会有Windows行结尾而shell无法识别它。

$ dos2unix MigrateNshell.sh

这有时会有所帮助。

答案 4 :(得分:2)

关于在脚本开头添加 shebang line ,有一些很好的评论。我还想添加建议,以便使用 env command ,以获得更多便携性。

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

答案 5 :(得分:2)

尝试chmod u+x MigrateNshell.sh

答案 6 :(得分:1)

#! /bin/bash
  ^---

删除指定的空格。 shebang应该是

#!/bin/bash

答案 7 :(得分:1)

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

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

如果我在命令行输入命令foo,我的shell将首先查看是否有可执行命令/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,我首先放在我的路径中。这样,我可以覆盖操作系统中的标准命令。例如,我有Ant 1.9.1,但Mac附带了Ant 1.8.4。我将ant命令放在/usr/local/bin中,因此我的ant版本将首先执行。我还为我自己的命令添加了$HOME/bin到PATH的末尾。如果我有一个你想要执行的文件,我会把它放在$ HOME / bin中来执行它。

答案 8 :(得分:0)

还要确保/ bin / bash是bash的正确位置....如果你从某个地方的某个例子中获取该行,它可能与您的特定服务器不匹配。如果您为bash指定了无效的位置,那么您将遇到问题。

答案 9 :(得分:0)

在.profile路径中添加以下行

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

export PATH

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

的情况下运行

Raj Dagla

答案 10 :(得分:0)

我也是shell脚本的新手,但是我遇到了同样的问题。确保脚本结尾处有空白行。否则它将无法正常工作。

答案 11 :(得分:-3)

首先:

chmod 777 ./MigrateNshell.sh

然后:

./MigrateNshell.sh

或者,将您的程序添加到$ PATH变量中可识别的目录中。示例:Path Variable Example 这将允许您在没有./

的情况下调用您的程序