Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Shell脚本未运行,未找到命令_Bash_Shell_Unix_Scripting - Fatal编程技术网

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

Bash Shell脚本未运行,未找到命令,bash,shell,unix,scripting,Bash,Shell,Unix,Scripting,我对UNIX编程非常陌生(通过终端在MacOSX Mountain Lion上运行)。我一直在学习生物信息学和分子方法课程的基础知识(我们有两个课程),最终我们将使用perl和python进行数据管理。无论如何,我们的任务是编写一个shell脚本,从一组文件中获取数据,并以特定程序可以读取的格式将其写入一个新文件(Migrate-N) 当我在命令行中输入一些函数时,我已经得到了一些函数来独立完成我所需要的工作,但是当我将它们全部放在一个脚本中并尝试运行它时,我得到了一个错误。以下是详细信息(很抱

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

当我在命令行中输入一些函数时,我已经得到了一些函数来独立完成我所需要的工作,但是当我将它们全部放在一个脚本中并尝试运行它时,我得到了一个错误。以下是详细信息(很抱歉篇幅太长):

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

第二组代码创建我需要的实际新文件,以.mig结尾。回音线是有关计数的数据(每个基因座的碱基对、分析中的总体、每个位点的样本等),程序需要这些信息。cat测线将通过在回波测线中指定的特定于位点的信息下方的所有格雷普生成的逐位点数据混合在一起。你无疑了解情况

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

我已经陷入这一僵局两天了,所以任何意见都将不胜感激!谢谢

#! /bin/bash
  ^---
删除指定的空间。舍邦应该是

#!/bin/bash

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

第一:

然后:

或者,将程序添加到$PATH变量中识别的目录。例子:
这将允许您在不使用
/

的情况下调用程序。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
    变量,将包含命令的目录添加到路径中

如果
.bash\u profile
不存在,您可以修改
$HOME/.bash\u profile
$HOME/.profile
。我这样做是为了添加
/usr/local/bin
,并将其放在路径的第一位。这样,我就可以覆盖操作系统中的标准命令。例如,我有Ant1.9.1,但Mac电脑有Ant1.8.4。我将我的
ant
命令放在
/usr/local/bin
中,因此我的
ant
版本将首先执行。我还为自己的命令在路径的末尾添加了
$HOME/bin
。如果我有一个像您想要执行的文件,我会将它放在$HOME/bin中执行。

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

#!/bin/bash 
然后将脚本标记为可执行文件,并从命令行执行它

chmod +x MigrateNshell.sh
./MigrateNshell.sh
或者简单地从命令行执行bash,并将脚本作为参数传入

/bin/bash MigrateNshell.sh

还要确保/bin/bash是bash的正确位置。。。。如果您从某个地方的示例中获取该行,它可能与您的特定服务器不匹配。如果为bash指定的位置无效,则会出现问题。

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

$ dos2unix MigrateNshell.sh

这有时会有所帮助。

在.profile路径中添加以下行

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

export PATH
现在,您的脚本应该可以在没有
/


拉吉·达格拉(Raj Dagla)

关于在脚本开头添加,有一些好的评论。我想补充一点,建议您也使用,以增加便携性


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

确保未使用“path”作为变量,这将覆盖环境变量的现有路径。

请尝试
chmo
#!/bin/bash 
chmod +x MigrateNshell.sh
./MigrateNshell.sh
/bin/bash MigrateNshell.sh
$ dos2unix MigrateNshell.sh
PATH=$PATH:$HOME/bin:$Dir_where_script_exists

export PATH