在终端输入的命令:
chmod 777 abc.sh
sudo ./abc.sh
每个 shell 程序都给出同样的错误:
.sh: command not found
包括这个简单的abc.sh
程序:
#!/bin/bash
# My first script
echo "Hello World!"
输出sudo od -c ./abc.sh
:
0000000 # ! / b i n / b a s h \n # M y
0000020 f i r s t s c r i p t \n \n e
0000040 c h o " H e l l o W o r l d
0000060 ! " \n \n
0000064
答案1
嗯,根据您告诉我们的情况,它应该可以完美运行……前提是存储它的分区支持 unix/posix 样式权限。如果我尝试从 vfat 或 ntfs 分区运行脚本,我总是会遇到此错误。考虑到它安装在名为 work 的位置,这是否位于具有 fat 或 ntfs 格式分区的 USB 驱动器上?如果是,您必须在脚本前加上 shell 前缀。检查分区,这可能是问题所在。将其移动到您的主目录,它可能会在支持 unix/posix 权限的文件系统上轻松运行。
检查是否确实如此:
mount |grep nisheet
是说 vfat、fuseblock 还是 ntfs?如果是的话...
两个选项:
- 在要运行的脚本前面加上shell前缀:
bash abc.sh
- 将其移动到支持 Unix/Posix 权限的文件系统:
前任:
mv abc.sh ~/
cd ~
chmod +x abc.sh
./abc.sh
答案2
检查其输出(来自 abc.sh 所在的目录):
$ type ./abc.sh
$ ./abc.sh
该type
命令将首先验证是否找到了 ./abc.sh。如果没有找到,它将退出并提示找不到该./abc.sh
文件。然后我们必须找出找不到文件名的原因。
另外,您用来创建脚本文件的编辑器名称是什么。如果您无意中使用了 Windows 编辑器(通过 wine),这可能会导致脚本中的行终止符出现问题。
尝试使用并编辑,例如nano
或gedit
。您可以使用其中一个推荐的编辑器并创建相同的示例文件,abc1.sh
并确保其中的行与您编辑的问题中的行完全相同。
顺便说一句,我重现您在问题中给出的错误消息的唯一方法是省略abc
该文件的一部分abc.sh
。
这些命令将产生你所看到的错误信息:
$ ./.sh
$ sudo .sh
请记住,每个错误都是独一无二的,在诊断问题时非常重要。测试和准确的脚本并提供准确的错误消息非常重要。
例如,permission denied
尝试执行未设置执行位的文件可能会导致错误。这可以通过执行您在问题中引用的命令来设置:
$ chmod 777 abc.sh
permission denied
尝试执行一个文件时,如果该文件的所有者没有设置读取权限或组权限,也可能会出错。这可能是在个人空间中不必要的root
使用造成的副作用。您在问题中提到的方法也可以通过向所有用户授予读取和执行权限来解决该问题。sudo
chmod 777
如果您创建的文件属于 root 用户,则必须使用提升的命令来更改属性。这将授予您执行该文件的权限:
$ sudo chmod 777 abc.sh
如果您有理由控制谁可以执行或访问脚本,您可以看看以下一些其他选项chmod
:
$ man chmod
正如问题评论中所建议的那样,您不应该使用提升的命令sudo
来运行您正在测试的脚本。如果测试在您的个人空间中进行,则可能会导致您的个人空间的某些区域被 root 所拥有……从而失去对这些区域的个人访问权限。一些格式错误的脚本还可能导致我们操作系统的其他系统文件损坏。您在尝试运行脚本时输入错误abc.sh
就是错误可能发生的一个例子。如果您决定删除脚本或脚本工作目录并错误地在错误的位置输入了空格,则可能会在您最意想不到的地方造成严重问题。
答案3
这不是提问者问题的解决方案,但它可能会对其他遇到此问题的人有所帮助:
command not found
如果在尝试运行脚本(例如)后出现问题sudo ./abc.sh
,请确保:
您有执行该文件的权限。您可以通过以下命令使该脚本对所有人可执行:
chmod a+x ./abc.sh
根据您当前的访问权限,您可能需要在此命令前加上前缀
sudo
。您可以使用以下命令检查当前访问权限:ls -la ./abc.sh
你的脚本有正确的舍邦,例如:
#!/bin/bash
否则,您必须通过调用所需的解释器来运行脚本,例如:
sudo bash ./abc.sh
您的脚本使用 Unix 行尾:每行(包括最后一行!)都必须以换行符(
\n
或0A
十六进制)结尾。例如,它不会使用 Windows 行尾(\r\n
或0D 0A
十六进制)运行。您可以使用以下命令调查您的行尾:hexdump -C ./abc.sh
答案4
如果脚本位于您当前所在的目录中,则必须使用:
. abc.sh
代替:
./abc.sh
假设您的用户有权限。