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

And*_*ili 5 command-line bash scripts environment-variables aptana-studio

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

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

!/bin/bash

export UBUNTU_MENUPROXY=0 /home/andrea/Programmi/Aptana_Studio_3/AptanaStudio3
Run Code Online (Sandbox Code Playgroud)

问题是,当我尝试使用我的 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
Run Code Online (Sandbox Code Playgroud)

为什么?我错过了什么?我该如何解决这个问题?

Eli*_*gan 11

有两个错误。简而言之,这是我建议的特定修复(详细信息如下):

#!/bin/sh
UBUNTU_MENUPROXY=0 /home/andrea/Programmi/Aptana_Studio_3/AptanaStudio3
Run Code Online (Sandbox Code Playgroud)

坏 Hashbang 线

正如Shutupsquare 所说,您的hashbang 系列技术细节)应该以 a 开头,#!而不仅仅是!.

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

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

#!/bin/sh
Run Code Online (Sandbox Code Playgroud)

不正确的使用 export

导致您的第二条错误消息并且是AptanaStudio3无法运行的原因的主要问题是您使用export不正确。该export命令不运行命令。所以你的命令被解释为环境变量本身。

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

假设你的目标是要运行的命令/home/andrea/Programmi/Aptana_Studio_3/AptanaStudio3UBUNTU_MENUPROXY定义的变量,并设置为0你刚才应该放弃这个词export干脆

UBUNTU_MENUPROXY=0 /home/andrea/Programmi/Aptana_Studio_3/AptanaStudio3
Run Code Online (Sandbox Code Playgroud)

这是从 shell 使用修改后的环境运行命令的标准方法。

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

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

  • 从语义上讲,您的目标不是导出任何内容,而是在修改后的环境中运行单个命令。使用export可能会给阅读您的脚本的其他人(或之后的您自己)造成混淆,并且作为次要考虑因素可以说不那么优雅。
  • 使用export,您需要两个命令;使用没有它的方式,你只需要一个。

可选阅读:该env命令的工作方式(某种程度上)与您尝试使用的方式相同export

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

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

env VARIABLE=value command
Run Code Online (Sandbox Code Playgroud)

不过你在这里不需要那个。所有 Bourne 风格的 shell(例如sh, dash, bash, ksh, zsh)都支持VARIABLE=value command.


squ*_*org 3

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

#!/bin/bash

export UBUNTU_MENUPROXY=0 
/home/andrea/Programmi/Aptana_Studio_3/AptanaStudio3
Run Code Online (Sandbox Code Playgroud)