【问题标题】:Command not found error message when running script运行脚本时找不到命令错误消息
【发布时间】:2010-10-05 19:26:16
【问题描述】:

我正在学习如何在 UNIX 中制作 shell 脚本,但我不断遇到这个愚蠢的错误。假设我制作了这样的脚本:

#!/bin/sh
echo HELLO

我将文件保存为测试,并使用 chmod 700 test 使命令可由我执行。我将文件保存在我的主目录中,并(尝试)像这样运行文件:

./test

仅供 UNIX 回复:

./test: Command not found.

发生了什么事?当我输入 ls -l 时,文件名旁边有一个星号。在我使用 chmod 命令之前,它不存在。谁能告诉我我做错了什么?

【问题讨论】:

  • ls /bin/sh 是否显示启用了可执行位的文件?
  • 添加缺少的斜线时,是否还遇到问题?您所在的目录是否带有任何(非常)特殊的选项?

标签: unix shell


【解决方案1】:

使其可执行:

chmod +x ./test

并确保将文件保存为 Unix 文件格式。并且:检查您的分区是否可执行(挂载)。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,我将文件从 Windows 复制到 Linux 并尝试执行它。我做了上面的所有建议,但没有任何帮助,直到我对文件做了一个 dos2unix 并修复了它。对你来说可能不是这样,但把它放在那里

    【讨论】:

      【解决方案3】:

      首先,检查 /bin/sh 是否存在,如果没有,那就是你的问题。

      如果您安装了 /bin/sh,那么我认为如果您的路径配置不正确,就会发生这种情况。 在这种情况下,您可以尝试:/bin/sh test.sh 来自 test.sh 所在的当前工作目录。

      如果您已从 Windows 复制文件,也请尝试 dos2unix test.sh

      【讨论】:

        【解决方案4】:

        这确实很奇怪。您描述的步骤应该有效,因此您的环境或这些步骤的执行中一定存在一些小错误。您可以做一些事情来帮助诊断:

        检查控制字符

        只要没有拼写错误或控制字符,您记录的内容看起来还不错。您应该输入以下内容进行检查:

        cat -vt ./test
        

        如果您看到任何可以解释问题的意外额外文本。例如,行尾的“^M”表示您的编辑器将文件保存为 Windows 格式。

        可靠地重新生成文件

        要创建已知良好的./test2,请复制粘贴以下命令:

        `which bash`
        printf "#\!`which sh`\necho HELLO\n" > ./test2
        chmod +x ./test2
        ./test2
        exit
        

        检查找不到哪个命令

        如果你输入...

        ./ajio
        

        ...你明白了吗...

        ./ajio: Command not found.  
        

        ...正如您在./test 中描述的那样?我只是编造了ajio这个名字,所以它不应该存在。如果他们的消息匹配,那么它并没有真正告诉你任何新的东西。但如果消息不同,则表明至少找到了 ./test 并且可以执行。

        也有可能您的sh 版本试图告诉您不是找不到test,而是在运行test 时找不到shell 尝试运行的某些命令。这不应该是 echo 命令,因为大多数 shell 实现将是一个内部命令,在 shell 内部实现。但是,shell 可能会运行一个初始化脚本,其中包含指定它无法运行的命令的行。如果你运行man sh,它会告诉你你的shell 可能尝试运行的所有不同的启动文件。这些可能与您以交互方式启动 shell 时使用的不同。但是,作为初学者,检查这些脚本的有效性可能会令人生畏。不过,任何虚假的定制都可能是针对您的个人 shell 启动过程,并且不会影响整个 Linux 安装,因此请运行 ls -ld ~/.* 以列出您主目录中的隐藏文件,并检查任何看起来像 shell 启动文件的文件(例如~/.bashrc、~/.profile、~/.bash_login)。检查它们指定的任何命令都可以找到,并在路径变量设置为包含它们的位置后调用。

        与另一个外壳比较

        如果 /bin/sh 安装/初始化有问题,那么您可以通过调用另一个 shell 来绕过它。试试……

        which zsh
        which tcsh
        which csh
        

        ...如果其中一个为您找到替代外壳,请编辑或重新创建指定该外壳的文件,唉...

        #!/bin/csh
        echo HELLO
        

        ...然后chmod +x 它和./-运行它。如果可行,那么您就知道您的问题是 /bin/sh 特定的。

        【讨论】:

        • 很棒的提示。查了man page,觉得可以简写成cat -t,和cat -vT一样。
        • 使用cat -vt 来检测我的脚本文件有不正确的Windows 行结尾,这节省了一天的时间。谢谢。
        【解决方案5】:

        看起来你需要在 bin 前添加一个斜线:

        #!/bin/sh
        # ^
        

        其他一切看起来都很好...我假设/bin/sh 是可执行Bournse shell 的位置——如果不是,则需要进行适当调整。如果没有前导斜杠,您的 shell 正在寻找bin/sh相对于您当前目录,而不是它真正所在的位置。

        您需要为您的脚本找到您想要(或需要)的可执行 shell 解释器。

        还有一些建议 - 在我的机器上我得到了这些结果:

        # tells you where sh resides, if it is on your path
        $ which sh
        /bin/sh
        
        # tells you which shell you are currently using
        $ echo $SHELL
        /bin/tcsh
        

        我可以在一个简单的 shell 脚本中将其中任何一个用于“shebang”行。例如,您可能会发现您的 Bourne shell 位于 /usr/bin 而不是 /bin

        【讨论】:

        • 好吧,我刚刚用你发布的内容替换了标题,我得到了同样的错误。
        【解决方案6】:

        如果./test 是一个可执行脚本,但执行它会给出错误消息./test: Command not found,请检查解释器是否存在。您必须提供绝对路径(不使用PATH 环境变量)。

        如果文件已经通过 Windows 机器,请确保在行尾没有虚假的回车,因为 CR 将是解释器文件名的一部分。您可以通过<test head -n 1 | od -t x1 进行检查:如果以0d 0a 结尾,则存在CR,您需要将其删除(您可能还需要从其他行中删除CR)。

        【讨论】:

          【解决方案7】:

          我在使用旧的 SCO OpenServer 5.0.7 虚拟机时遇到了类似的问题。让我发疯,我无法运行以

          开头的某些脚本

          "#!/bin/bash"

          (当然,减去引号)在阅读此处的线程时,我突然想到检查 /bin/bash 是否存在。原来它不见了。我从 SKUNKWARE2000 CD 安装,一切都很好。

          【讨论】:

            【解决方案8】:

            #! 告诉 Unix 使用指定的程序执行你的脚本。在您的情况下,您指定了bin/sh,但它应该是/bin/sh。 Unix 给出的错误信息并不清楚它找不到哪个程序。

            【讨论】:

              【解决方案9】:

              为了补充马丁的答案,您说您将文件保存在您的主目录中并以./test 运行它。这仅在您当前的工作目录与您的主目录相同时才有效。

              文件名旁边的星号表示该文件是可执行文件。

              【讨论】:

              • 嗯,我目前在我的主目录中。
              • @Waffles:如果 Martin 的回答没有帮助,并且您位于文件所在的同一目录中...您确定您有 /bin/sh 程序吗?它可能是 /bin/zsh 或 '/bin/bash`,具体取决于您正在运行的类 UNIX 系统。
              • 任何可以合理地称为 unix 的东西都有一个 Bourne 或 POSIX shell 为 /bin/sh,即使首选的 shell 是 /bin/bash/bin/ksh 之类的其他东西。
              • @Gilles:好吧,除非你把系统搞砸了,Waffles 可以看看他的问题 :)
              【解决方案10】:
              猜你喜欢
              • 1970-01-01
              • 2014-03-18
              • 1970-01-01
              • 1970-01-01
              • 2020-11-04
              • 2022-08-17
              • 1970-01-01
              • 2014-01-05
              • 2013-04-26
              相关资源
              最近更新 更多