为什么当我尝试执行这个简单的 bash 脚本时会出现此错误?

为什么当我尝试执行这个简单的 bash 脚本时会出现此错误?

我正在关注本教程在我的 Ubuntu 14.04 上正确执行 Aptana Studio:

因此,我已经安装了 Oracle JRE,并且最后创建了这个run.sh必须执行 Aptana 的文件:

!/bin/bash

export UBUNTU_MENUPROXY=0 /home/andrea/Programmi/Aptana_Studio_3/AptanaStudio3

问题是,当我尝试使用我的 shell 执行该脚本时,我收到以下错误消息:

andrea@andrea-virtual-machine:~/Programmi/Aptana_Studio_3$ sudo sh run.sh
run.sh: 1: run.sh: !/bin/bash: not found
run.sh: 3: export: /home/andrea/Programmi/Aptana_Studio_3/AptanaStudio3: bad variable name

为什么?我遗漏了什么?我该如何解决这个问题?

答案1

有两个错误。简而言之,这是我建议的具体修复方法(详情如下):

#!/bin/sh
UBUNTU_MENUPROXY=0 /home/andrea/Programmi/Aptana_Studio_3/AptanaStudio3

糟糕的哈希班线

作为Shutupsquare 说, 你的哈希班线技术细节) 应该以 a 开头,#!而不是仅仅以 开头!

这导致了您的两个错误消息中的第一个,并将阻止您的脚本以 方式运行./run.sh,但这不是您的脚本无法运行的原因AptanaStudio3(因为调用语法不需要 hashbang 行sh run.sh)。

顺便说一下,当你运行的时候sh run.sh,它会运行你的脚本sh作为解释器。但是使用 hashbang 行#!/bin/bash,运行./run.sh将使用bash作为解释器。此脚本不以任何方式依赖于的高级功能bash,尽管bash的额外内存使用量对于此应用程序来说几乎可以肯定是微不足道的,但您可能仍希望编写 hashbang 行,以便./run.sh使用运行脚本sh

#!/bin/sh

错误使用export

导致出现第二条错误消息并导致运行失败的主要问题AptanaStudio3是您使用export不当。该export命令不会运行命令。因此,您的命令本身被解释为环境变量。

  • export可以设置和导出环境变量:

    export NAME=value
    
  • export还可以导出环境变量(无论其当前值是什么):

    export NAME
    

export不是但是,接受NAME=value commandNAME command语法。

/home/andrea/Programmi/Aptana_Studio_3/AptanaStudio3假设您的目标是运行定义变量UBUNTU_MENUPROXY并将其设置为的命令0你应该放弃这个词export

UBUNTU_MENUPROXY=0 /home/andrea/Programmi/Aptana_Studio_3/AptanaStudio3

这是从 shell 运行具有修改环境的命令的标准方法。

的目的export是将变量导出到所有随后启动的子进程的环境中(即从脚本运行的每个命令)。因此,export UBUNTU_MENUPROXY=0在其自己的行上运行,然后AptanaStudio3命令,如下Shutupsquare建议,将会起作用,并且具有相同的效果,并且是一种非常好且可以接受的方法。

我更喜欢上面建议的方式(没有 export) 因为:

  • 从语义上讲,你的目标不是导出任何东西,而是运行一个单身的使用修改环境的命令。使用export可能会让阅读脚本的其他人感到困惑(或者让您自己稍后感到困惑),并且作为次要考虑可能不太优雅。
  • 使用export,您需要两个命令;使用不带 的方式,您只需要一个。

可选阅读:该env命令的工作方式(有点)与您尝试使用的方式相同export

最后,接受语法的命令NAME=value command。此命令是env。没有理由在此 shell 脚本中使用它——在基本用法中,它的功能是在修改的环境下运行命令时提供(部分)shell 的功能,而您已经拥有该功能。

然而,在某些情况下,外部在 shell 脚本中,您可能会发现需要为命令设置环境变量并运行该命令(并在单个命令中执行这些操作)。在VARIABLE=value command不支持仅使用该行的上下文中,您可以使用:

env VARIABLE=value command

不过这里你不需要它。所有 Bourne 风格的 shell(例如sh,、、、、)都支持。dashbashkshzshVARIABLE=value command

答案2

应该是#!/bin/bash。我还认为你应该在末尾有一个换行符export UBUNTU_MENUPROXY=0

#!/bin/bash

export UBUNTU_MENUPROXY=0 
/home/andrea/Programmi/Aptana_Studio_3/AptanaStudio3

相关内容