尝试运行UNIX脚本后,找不到命令错误消息

Waf*_*les 12 unix shell

我正在学习如何在UNIX中创建shell脚本,但我一直遇到这个愚蠢的错误.假设我制作了一个这样的脚本:

#!/bin/sh
echo HELLO
Run Code Online (Sandbox Code Playgroud)

我将文件保存为测试,并使用chmod 700 test使命令可执行.我将文件保存在我的主目录中,并(尝试)运行该文件,如下所示:

./test
Run Code Online (Sandbox Code Playgroud)

仅限UNIX回复:

./test: Command not found.
Run Code Online (Sandbox Code Playgroud)

到底是怎么回事?当我输入ls -l时,文件名旁边有一个星号.在我使用chmod命令之前就没有了.谁能告诉我我做错了什么?

ivy*_*ivy 12

使其可执行:

chmod +x ./test
Run Code Online (Sandbox Code Playgroud)

并确保以Unix文件格式保存文件.并且:检查您的分区是否可执行(mount).


Ton*_*roy 10

这确实非常奇怪.您描述的步骤应该有效,因此您的环境中必须存在一些小错误或执行这些步骤.您可以采取一些措施来帮助诊断:

检查控制字符

只要没有拼写错误或控制字符,您所记录的内容看起来就很好.你应该输入:

cat -vt ./test
Run Code Online (Sandbox Code Playgroud)

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

重新生成文件可靠

要创建已知商品./test2,请复制粘贴以下命令:

`which bash`
printf "#\!`which sh`\necho HELLO\n" > ./test2
chmod +x ./test2
./test2
exit
Run Code Online (Sandbox Code Playgroud)

检查哪些命令无法找到

如果你输入......

./ajio
Run Code Online (Sandbox Code Playgroud)

......你真的得到......

./ajio: Command not found.  
Run Code Online (Sandbox Code Playgroud)

......正如你所描述的那样./test?我刚刚编写了名字ajio,所以它不应该存在.如果他们的消息匹配,那么它并没有真正告诉你任何新的东西.但如果消息不同,则确认./test至少已找到且可执行.

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

比较另一个壳

如果/ bin/sh install/initialisation存在问题,那么您可以通过调用另一个shell来绕过它.尝试...

which zsh
which tcsh
which csh
Run Code Online (Sandbox Code Playgroud)

...如果其中一个或多个找到了替代shell,请编辑或重新创建指定shell的文件,ala ...

#!/bin/csh
echo HELLO
Run Code Online (Sandbox Code Playgroud)

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

  • 使用“cat -vt”检测我的脚本文件是否有不正确的 Windows 行结尾,挽救了局面。谢谢。 (2认同)

mar*_*ton 5

看起来你需要在bin之前使用斜杠:

#!/bin/sh
# ^
Run Code Online (Sandbox Code Playgroud)

其他一切看起来很好......我假设这/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
Run Code Online (Sandbox Code Playgroud)

我可以在一个简单的shell脚本中使用其中任何一个作为' shebang '行.您可能会发现您的Bourne shell位于/usr/bin而不是/bin例如.