foo.sh我的主文件夹中有一个脚本。
foo.sh
当我导航到该文件夹并输入时./foo.sh,我得到
./foo.sh
-bash: ./foo.sh: Permission denied。
-bash: ./foo.sh: Permission denied
当我使用时sudo ./foo.sh,我得到
sudo ./foo.sh
sudo: foo.sh: command not found。
sudo: foo.sh: command not found
为什么会发生这种情况,我该如何解决?
没有权限
为了运行脚本,文件必须 设置可执行权限 。
为了完全理解Linux 文件权限,您可以学习chmod命令的文档。chmod是 change mode 的缩写,是用于更改文件的权限设置的命令。
chmod
要阅读本地系统的chmod文档,请运行man chmod或info chmod从命令行运行。阅读并理解后,您应该能够理解运行的输出…
man chmod
info chmod
ls -l foo.sh
…这将列出文件所有者,组所有者以及不是文件所有者或文件所属组成员的其他所有人的READ,WRITE和EXECUTE权限(有时会引用最后一个权限组作为“世界”或“其他”)
这是有关如何解决您的情况下“ 拒绝权限”错误 的摘要。
$ 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而言,foo.sh现在是可执行的。
在命令中使用sudo结果未找到
使用 sudo 运行命令时,您实际上是以超级用户或root用户身份运行它的。
根用户没有找到自己指令的原因,很可能是PATH根环境变量不包括 地方目录foo.sh所在。因此找不到命令。
PATH
PATH环境变量包含要搜索命令的目录列表。每个用户根据自己的需求设置自己的PATH变量。看看它要运行什么
env | grep ^PATH
这是一些env先以普通用户身份然后以sudo身份以root用户身份运行上述命令的示例输出
env
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
请注意,尽管类似,但在这种情况下,PATH中包含的目录(非特权用户(rkielty))和超级用户 并不相同 。
其中目录foo.sh所在是不存在于根用户的PATH变量,因此 命令没有发现 错误。