Bash脚本可以在家中调用,但不能在脚本目录中调用
尝试使脚本可调用时,我遇到了一个非常奇怪的错误。 我在/ srv / projectname / scripts中有一个脚本目录,在那里我存储了一些脚本,可以作为不同项目的cron作业调用。 我正在尝试添加一个新的,并看到非常奇怪的行为。 在调试中,我使用这组命令重现它
从/ srv / projectname / scripts创建一个文件创建一个文件
vi helloworld.sh
完全插入文字:
#!/usr/bin/env bash echo "Hello World!"
使脚本可执行并尝试调用它:
chmod +x helloworld.sh ./helloworld.sh
这使:
-bash: ./helloworld.sh: Permission denied
确保没有代码错误:
bash helloworld.sh
这使:
Hello World!
将脚本复制到home并调用它:
cp helloworld.sh ~/helloword.sh ~/helloword.sh
这使:
Hello World!
我不知道发生了什么事。 我已经尝试了很多变种,我给出了完整的路径,相同的错误,或者如果我没有给出任何错误的sudo,但也没有打印“Hello World!”。
其他细节:运行于:Ubuntu 12.04.4 LTS我也注意到我无法用Tab键完成一个给我这个错误的脚本的全名,但是我可以移动它。 目录/ srv / projectname是一个git repo,但是这个脚本还没有被添加到它,因为我通常只在它工作之后才这样做。
ls -l行为脚本和脚本目录
-rwxrwxr-x 1 ubuntu ubuntu 41 Apr 21 20:25 helloworld.sh drwxrwxr-x 3 ubuntu ubuntu 4096 Apr 21 20:25 scripts
分别
任何帮助都是极好的。
编辑:吉尔斯有答案。 要保存有此问题的其他人进行谷歌搜索。
sudo mount /srv/projectname/ -o remount
重新加载已编辑的fstab,一切都有效。
文件权限说它是可执行的,但文件不可执行。 这可能发生的原因有三个。
- 您没有深入挖掘文件权限 – 有一个访问控制列表使您的文件不可执行。 您可以使用命令
getfacl /path/to/file
查看文件的ACL。 这不是这里的情况,因为ls -l
显示文件上没有ACL(权限末尾会有一个+
,例如-rwxr-xr-x+
)。 - 该文件存储在使用
noexec
选项安装的卷上。 将users
置于fstab
行中(如果您希望使文件系统可由用户安装并允许用户在其上执行文件,请使用noauto,users,exec
)隐含此选项。 此挂载选项会导致所有常规文件无法执行,无论其权限如何。 - 该文件是一个脚本,它引用一个在其shebang行中不可执行的解释器,或一个引用不可执行的动态加载器的动态链接二进制文件。 这不是这里的情况,因为复制文件会产生一个可以执行的文件(并且
/usr/bin/env
无论如何都是可执行的)。
通过消除过程,文件位于使用noexec
选项安装的卷上。
唯一的解决方法是:
- 不要使用
noexec
选项安装卷。 此选项没有安全隐患(与nosuid
和nodev
不同,这样做)。 它对于没有执行权限概念的文件系统来说非常有用,你可以选择让所有东西都可执行或者什么也不做。 - 在执行文件之前复制该文件。
- 使用bind mount或bindfs创建可执行文件可执行文件系统的视图。
- 显式调用解释器或动态加载器,例如
bash helloworld.sh
。 这不执行helloworld.sh
,它优先于从helloworld.sh
读取的/bin/bash
。