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选项安装卷。 此选项没有安全隐患(与nosuidnodev不同,这样做)。 它对于没有执行权限概念的文件系统来说非常有用,你可以选择让所有东西都可执行或者什么也不做。
  • 在执行文件之前复制该文件。
  • 使用bind mount或bindfs创建可执行文件可执行文件系统的视图。
  • 显式调用解释器或动态加载器,例如bash helloworld.sh 。 这不执行helloworld.sh ,它优先于从helloworld.sh读取的/bin/bash