Por que eu obtenho este erro quando tento executar este simples script bash?

5

Estou seguindo este tutorial para executar corretamente o Aptana Studio no meu Ubuntu 14.04:

Portanto, instalei o Oracle JRE e, finalmente, criei esse arquivo run.sh que precisa executar o Aptana:

!/bin/bash

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

O problema é que quando eu tento executar este script com meu shell eu obtenho a seguinte mensagem de erro:

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

Por quê? o que estou perdendo? Como posso resolver este problema?

    
por AndreaNobili 03.08.2014 / 22:47

2 respostas

10

Existem dois erros. Resumindo, essa é a correção específica que eu sugeriria (detalhes a seguir):

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

Bad Hashbang Line

Como Shutupsquare diz , o seu hashbang line ( detalhes técnicos ) deve começar com um #! em vez de apenas ! .

Isso está causando a primeira de suas duas mensagens de erro e impedirá que seu script seja executado como ./run.sh , mas não é a razão pela qual seu script não está executando AptanaStudio3 (porque a linha hashbang não é necessária para sh run.sh sintaxe de chamada).

A propósito, quando você executa sh run.sh , ele executa seu script com sh como o intérprete. Mas com a linha de hashbang #!/bin/bash , executar ./run.sh executaria seu script com bash como o intérprete. Esse script não depende de forma alguma dos recursos avançados de bash , e embora o uso de memória adicional de bash seja quase certamente insignificante para esse aplicativo, talvez você ainda deseje gravar a linha de hashbang, de modo que ./run.sh execute o script com sh :

#!/bin/sh

Uso incorreto de export

O problema principal, que está causando sua segunda mensagem de erro e é o motivo pelo qual AptanaStudio3 falha na execução, é que você está usando export incorretamente. O comando export não executa comandos. Então, seu comando está sendo interpretado como uma variável de ambiente em si.

  • export pode definir e exportar uma variável de ambiente:

    export NAME=value
    
  • export também pode exportar uma variável de ambiente (com qualquer valor atual):

    export NAME
    
No entanto,

export não aceita a sintaxe NAME=value command ou NAME command .

Assumindo que sua meta é executar o comando /home/andrea/Programmi/Aptana_Studio_3/AptanaStudio3 com a variável UBUNTU_MENUPROXY definida e definida como 0 , você deve soltar a palavra export :

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

Essa é a maneira padrão de executar um comando com um ambiente modificado, a partir de um shell.

O objetivo de export é exportar variáveis para os ambientes de todos os processos filhos lançados posteriormente (por exemplo, todos os comandos executados em seu script). Portanto, executar export UBUNTU_MENUPROXY=0 em sua própria linha, seguido pelo comando AptanaStudio3 , como Shutupsquare sugere , funcionará e terá o mesmo efeito, e é uma maneira perfeitamente boa e aceitável de fazê-lo.

Eu prefiro a maneira que sugeri acima ( sem export ) porque:

  • Semanticamente, seu objetivo não é exportar nada, mas executar um comando único com um ambiente modificado. Usar export pode causar confusão para os outros que leem seu roteiro (ou para você mesmo mais tarde), e como uma consideração secundária é sem dúvida menos elegante.
  • Com export , você precisa de dois comandos; usando o caminho sem ele, você precisa de apenas um.

Leitura opcional: o comando env funciona (mais ou menos) como você estava tentando usar export

Finalmente, é um comando que aceita a sintaxe NAME=value command . Este comando é env . Não há razão para usá-lo neste script de shell - sua função, nesse uso básico, é fornecer (parte de) o poder de um shell ao executar um comando com um ambiente modificado, e você já tem esse poder.

No entanto, em algumas circunstâncias, fora do shell script, você pode achar necessário definir uma variável de ambiente para um comando e executar esse comando (e fazer essas coisas em um único comando). Em contextos em que apenas o uso da linha VARIABLE=value command não é suportado, você pode usar:

env VARIABLE=value command

Você não precisa disso aqui. Todos os shells ao estilo Bourne (por exemplo, sh , dash , bash , ksh , zsh ) suportam VARIABLE=value command .

    
por Eliah Kagan 03.08.2014 / 23:27
3

Deve ser #!/bin/bash . Eu também acho que você deveria ter uma nova linha no final de export UBUNTU_MENUPROXY=0 .

#!/bin/bash

export UBUNTU_MENUPROXY=0 
/home/andrea/Programmi/Aptana_Studio_3/AptanaStudio3
    
por stedotmartin 03.08.2014 / 22:54