我的主文件夹中有一个名为foo.sh的脚本.

当我导航到此文件夹并输入./foo.sh时,我得到

-bash: ./foo.sh: Permission denied

当我使用sudo ./foo.sh时,我得到

sudo: foo.sh: command not found

为什么会发生这种情况,我该如何解决?

推荐答案

Permission denied

为了运行脚本,文件必须有an executable permission bit set个字符.

为了完全理解Linux file permissions,您可以学习chmod命令的文档.chmodchange mode的缩写,是用于更改文件权限设置的命令.

要阅读本地系统的chmod文档,请从命令行运行man chmodinfo chmod.一旦阅读和理解,你应该能够理解运行的输出...

ls -l foo.sh

... 它将列出文件所有者、组所有者以及所有其他非文件所有者或文件所属组成员(最后一个权限组有时称为"世界"或"其他")的读取、写入和执行权限

以下是如何在您的 case 中排除Permission Denied error个故障的摘要.

$ ls -l foo.sh                    # Check file permissions of foo
-rw-r--r-- 1 rkielty users 0 2012-10-21 14:47 foo.sh 
    ^^^ 
 ^^^ | ^^^   ^^^^^^^ ^^^^^
  |  |  |       |       | 
Owner| World    |       |
     |          |    Name of
   Group        |     Group
             Name of 
              Owner 

所有者具有读写权限rw,但-表示缺少可执行权限

chmod命令解决了这个问题.(组和其他组仅对文件设置了读取权限,不能写入或执行该文件)

$ chmod +x foo.sh               # The owner can set the executable permission on foo.sh
$ ls -l foo.sh                  # Now we see an x after the rw 
-rwxr-xr-x 1 rkielty users 0 2012-10-21 14:47 foo.sh
   ^  ^  ^

福.就Linux而言,sh现在是可执行的.

Using sudo results in Command not found

使用sudo运行命令时,实际上是以超级用户或root用户的身份运行它.

root用户找不到您的命令的原因可能是root的PATH环境变量不包括directory where 101 is located.因此,找不到该命令.

PATH环境变量包含用于搜索命令的目录列表.每个用户根据自己的需要设置自己的路径变量.

env | grep ^PATH

下面是以普通用户身份运行上述env命令的一些示例输出,然后以root用户身份使用sudo

rkielty@rkielty-laptop:~$ env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

rkielty@rkielty-laptop:~$ sudo env | grep ^PATH
[sudo] password for rkielty: 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

请注意,尽管类似,但在本例中,非特权用户(rkielty)和超级用户路径中包含的目录是not the same.

根用户的PATH变量中不存在foo.sh所在的目录,因此出现command not found错误.

Linux相关问答推荐

PERF显示不应该执行指令的内核的用户空间周期

Linux 上 Ada 任务优先级的语义是什么?

运行系统命令失败,但相同的命令可以直接在 bash 中执行

如何从 AWK 中的 CSV 列中获取中值? (Linux)

删除 csv 列中的不匹配值

Rust unix 进程

为什么 printf 仍然可以使用低于 XMM 寄存器中 FP args 数量的 RAX?

如何在 Linux 中向应用程序发出信号而不杀死它?

如何比较两个压缩包的内容

如何增加 /proc/pid/cmdline 4096 字节限制?

当命令太长时,命令行会自动覆盖

如何像 Nautilus 那样从命令行挂载?

在 Ubuntu 中重启 Nginx

使用 Scp 时防止覆盖文件

为什么 mmap() 比顺序 IO 快?

execv() 和 fork() 的时间浪费

如何使用 C++ 在 Linux 中获取总 CPU 使用率

os.walk 没有隐藏文件夹

cat、grep 和 cut - 翻译成 python

如何在 Linux 中将 .so 文件添加到 java.library.path