正在获取执行bash脚本的权限

正在获取执行bash脚本的权限,bash,ubuntu,Bash,Ubuntu,我试图让我的服务器执行一个简单的bash脚本: #!/bin/bash echo Hello World 在将它保存到/var/www/script(我将它保存到web目录中,没有特别的原因)之后,我尝试使用 exec /var/www/script 这无法返回我没有执行它的权限,sudo-exec不是一件事,所以我做了sudo-i,然后以root用户身份运行exec/var/www/script,我的权限仍然被拒绝。我相当不确定为什么作为root执行它不起作

我试图让我的服务器执行一个简单的bash脚本:

   #!/bin/bash          
   echo Hello World
在将它保存到/var/www/script(我将它保存到web目录中,没有特别的原因)之后,我尝试使用

exec /var/www/script
这无法返回我没有执行它的权限,
sudo-exec
不是一件事,所以我做了
sudo-i
,然后以root用户身份运行
exec/var/www/script
,我的权限仍然被拒绝。我相当不确定为什么作为root执行它不起作用。我想知道我是不是

A) 使用错误的命令执行bash脚本
B) 脚本中的格式不正确
C) 不应该将其保存到/var/www/
D) 做了一些我都不知道的事情

如果有帮助的话,我正在运行ubuntu server 16.04。

文件权限 首先,确保您具有正确的文件权限:

chmod +x /var/www/script_name #Gives the current user execute permissions
执行Bash脚本 要执行
bash
脚本,最简单的方法是通过键入脚本的相对路径来调用它(无需任何其他命令):

/var/www/script_name
从shell显式执行脚本还有其他选项(在您的情况下,使用
bash
shell将脚本作为
bash
脚本执行)。从

脚本也可以由给定的shell显式执行,但通常,我们仅在希望获得特殊行为(如检查脚本是否与另一个shell一起工作或打印跟踪以进行调试)时才执行此操作:

关于文件扩展名的说明:“Shebang”行>文件扩展名 建议不要在脚本中使用文件扩展名,尤其是当您认为代码可能会超出其当前功能时

万一你想知道文件扩展名是否是你的问题。。。事实并非如此。知道脚本的文件扩展名根本不是必需的,这一点很重要。重要的是你在“shebang”行中放了什么:

要使用
sh
shell:

#!/bin/sh
#!/bin/bash
要使用
bash
shell:

#!/bin/sh
#!/bin/bash
使用什么文件扩展名无关紧要,“shebang”行指示将使用什么shell来执行脚本。您可以使用
#的“shebang”保存脚本/bin/bash
作为
script\u name.py
,但它仍然是
bash
脚本。如果您尝试执行它,
/script\u name.py
,它将作为
bash
脚本执行

正如@Arjan在评论中提到的,如果您决定更改项目的实现(即不同的shell/语言),那么为脚本使用文件扩展名可能会导致不必要的复杂性:

我可以稍后决定将我的项目转移到
sh
python
perl
C
,等等。可能是因为我想添加功能。也许是因为我想让它在没有
bash
的情况下可以移植到系统中。如果我使用
.sh
文件扩展名,那么会更加困难,因为那时我需要更改对脚本的所有引用,因为我更改了脚本的实现

你有两个选择:

  • 将其作为bash的参数运行:

    bash /var/www/script
    
  • 或者,设置执行位:

    chmod +x /var/www/script
    
    现在,您可以直接执行它:

    /var/www/script
    

  • 为什么需要确保将
    bash
    脚本保存为
    script\u name.sh
    ?你确定任何
    bash
    脚本都将在
    sh
    sh script\u name中运行。sh
    将始终适用于
    bash
    脚本吗?它不是Ubuntu的bash脚本文档,也没有任何正式的内容。这是一个用户创建的社区wiki页面。它表示,(通常使用.sh文件扩展名作为参考,但不是必需的。在我们的示例中,我们将使用.sh扩展名)。我认为这纯粹是为了初学者指南的上下文。例如,Ubuntu的
    /etc/init.d/
    目录中没有一个脚本带有该扩展名。我反对使用.sh扩展,这是一个实现细节。如果我的脚本在上百个地方被使用,而我将其更改为python脚本,那该怎么办?对于另一个问题,您可以试试这个:save
    var=“blah”;cat@Arjan噢,这很有意义-我将编辑我的答案,以反映
    bash
    sh
    的差异,这是我认为没有考虑的关键。但是,使用
    .bash
    扩展而不是完全不使用扩展,不是更好吗?命名脚本时使用无文件扩展名有什么好处?我不知道为什么要将其更改为python脚本。实际上,不知道是关键,而python只是一个例子。我可以稍后决定使用sh、python、perl编写一个C程序。。。也许是因为我想添加功能。也许是因为我必须使它能够移植到一个没有
    bash
    的系统。如果仅仅因为更改了脚本的实现就需要更改对脚本的所有引用,那就太糟糕了。或者如果我必须使用扩展名为sh的C程序。或者在我的bin dir中添加符号链接。