在终端输入的命令:
chmod 777 abc.sh
sudo ./abc.sh
Run Code Online (Sandbox Code Playgroud)
每个shell程序都给出相同的错误:
.sh: command not found
Run Code Online (Sandbox Code Playgroud)
包括这个简单的abc.sh程序:
#!/bin/bash
# My first script
echo "Hello World!"
Run Code Online (Sandbox Code Playgroud)
的输出sudo od -c ./abc.sh:
chmod 777 abc.sh
sudo ./abc.sh
Run Code Online (Sandbox Code Playgroud)
检查此输出(从 abc.sh 所在的目录):
$ type ./abc.sh
$ ./abc.sh
Run Code Online (Sandbox Code Playgroud)
该type命令将首先验证您的 ./abc.sh 是否已找到。如果不是,它将退出并说找不到该./abc.sh文件。然后我们必须找出无法找到的文件名的原因。
另外,您用来创建脚本文件的编辑器的名称是什么。如果您无意中使用了 Windows 编辑(通过 wine),这可能会导致脚本中的行终止符出现问题。
尝试使用并编辑例如nano或gedit。您可以使用推荐的编辑器之一并创建相同的示例文件,abc1.sh并确保您的行与编辑的问题中的行完全相同。
顺便说一句,我可以重现您在问题中给出的错误消息的唯一方法是省略文件abc的部分abc.sh。
这些命令将产生您的消息的错误:
$ ./.sh
$ sudo .sh
Run Code Online (Sandbox Code Playgroud)
请记住,每个错误都是独特的,并且对于诊断问题很重要。测试和准确的脚本并给出准确的错误消息非常重要。
例如,permission denied尝试执行未设置执行位的文件可能会导致错误。这可以通过执行您在问题中引用的命令来设置:
$ chmod 777 abc.sh
Run Code Online (Sandbox Code Playgroud)
您还可能permission denied通过尝试执行由其拥有root且没有设置用于读取的世界或组位的文件来获得该错误。sudo这可能是不必要时在个人空间中使用的副作用。您chmod 777在问题中提到的也可以通过向所有用户授予读取和执行权限来解决该问题。
如果您创建的文件由 root 拥有,则必须使用提升的命令来更改属性。这将使您能够执行该文件:
$ sudo chmod 777 abc.sh
Run Code Online (Sandbox Code Playgroud)
如果您有理由控制谁可以执行或访问脚本,您可以看看以下一些其他选项chmod:
$ man chmod
Run Code Online (Sandbox Code Playgroud)
正如问题评论中所建议的,您不应使用提升的命令sudo来运行您正在测试的脚本。如果测试是在您的个人空间中进行,则可能会导致您的个人空间区域被 root 拥有...失去对这些区域的个人访问权限。一些格式不正确的脚本还可能导致操作系统的其他系统文件损坏。尝试运行abc.sh脚本时输入错误就是可能发生错误的一个例子。如果您决定删除脚本或脚本工作目录,并且错误地将空格放在错误的位置,则可能会在您最意想不到的情况下导致严重问题。