【问题标题】:Shell script not running, command not foundShell 脚本未运行,未找到命令
【发布时间】:2013-05-13 19:27:17
【问题描述】:

我对 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

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

第二组代码创建了我最终需要的实际新文件,该文件以 .mig 结尾。回波线是程序需要信息的计数数据(每个位点的碱基对、分析中的种群、每个位点的样本等)。猫线将通过在回声线中指定的特定于站点的信息下方的所有 grepping 创建的站点数据将轨迹混合在一起。毫无疑问,你明白了。

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

localhost:HW Mirel$ MigrateNshell.sh
-bash: MigrateNshell.sh: command not found

我已经陷入僵局两天了,因此非常感谢您提供任何意见!谢谢!!

【问题讨论】:

  • MigrateNshell.sh 的位置是否在您的PATH 中?如果尝试从当前目录运行它,请尝试./MigrateNshell.sh。

标签: bash shell unix scripting


【解决方案1】:

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

$ ./MigrateNshell.sh

【讨论】:

  • 也可以指定解释器:bash MigrateNshell.sh。即使没有执行权限也可以使用。
【解决方案2】:

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

#!/bin/bash 

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

chmod +x MigrateNshell.sh
./MigrateNshell.sh

或简单地从命令行执行 bash,将脚本作为参数传递

/bin/bash MigrateNshell.sh

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      还可以尝试dos2unix shell 脚本,因为有时它有 Windows 行尾并且 shell 无法识别它。

      $ dos2unix MigrateNshell.sh
      

      这有时会有所帮助。

      【讨论】:

      • 这为我解决了。在这种情况下,我可以通过在 vi 中注意到附加到每一行的 ^M 来看到问题(在这个答案提出之后)。奇怪的是 gvim 认为它已经是 Unix 格式,所以它一定只是单行结尾错误。
      • 我到处找都忘了我已经在 Windows 中编辑过文件了!
      【解决方案5】:

      试试chmod u+x MigrateNshell.sh

      【讨论】:

        【解决方案6】:

        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。

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

        【讨论】:

          【解决方案7】:
          #! /bin/bash
            ^---
          

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

          #!/bin/bash
          

          【讨论】:

          • hashbang 后面通常允许有一个空格。
          【解决方案8】:

          有一些关于将 shebang line 添加到脚本开头的好方法。我想添加一个使用 env command 的建议,以提高便携性。

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

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              【解决方案10】:

              在您的 .profile 路径中添加以下行

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

              现在您的脚本应该可以在没有./ 的情况下运行

              拉吉达格拉

              【讨论】:

                【解决方案11】:

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

                【讨论】:

                  【解决方案12】:

                  第一:

                  chmod 777 ./MigrateNshell.sh
                  

                  然后:

                  ./MigrateNshell.sh
                  

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

                  的情况下调用您的程序

                  【讨论】:

                  • 让chmod 755,而不是chmod 777。 777 为系统上的每个人提供写权限。 755 给你完全的权限,但只能读取和执行给其他人。
                  • 无论您希望完成什么,chmod 777 都是错误且危险的。您将希望恢复到尽快获得合理的权限(对于您的用例,可能是chmod 755),如果您在面向公众的系统上拥有全球可写系统文件,至少调查它是否可能被破坏并用作闯入的支点您组织的网络。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-08-17
                  • 2018-05-06
                  • 2016-04-19
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多