web-dev-qa-db-fra.com

Pourquoi j'obtiens cette erreur lorsque j'essaie d'exécuter ce script bash simple?

Je suis ce tutoriel pour exécuter correctement Aptana Studio sur Ubuntu 14.04:

J'ai donc installé Oracle JRE et j'ai finalement créé ce fichier run.sh devant exécuter Aptana:

!/bin/bash

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

Le problème est que lorsque j'essaie d'exécuter ce script avec mon shell, j'obtiens le message d'erreur suivant:

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

Pourquoi? Qu'est-ce que je rate? Comment puis-je résoudre ce problème?

5
AndreaNobili

Il y a deux erreurs. En bref, voici le correctif que je suggérerais (les détails suivent):

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

Bad Hashbang Line

Comme Shutupsquare dit , votre ligne de hachage ( détails techniques ) devrait commencer par un #! plutôt que simplement !.

Cela provoque le premier de vos deux messages d'erreur et empêchera votre script d'être exécuté en tant que ./run.sh, mais ce n'est pas la raison pour laquelle votre script ne parvient pas à exécuter AptanaStudio3 (car la ligne hashbang n'est pas requise pour la syntaxe d'appel sh run.sh.).

En passant, lorsque vous exécutez sh run.sh, il exécute votre script avec sh comme interprète. Mais avec la ligne de hachage #!/bin/bash, exécuter ./run.sh exécuterait votre script avec bash comme interprète. Ce script ne dépend en aucune façon des fonctionnalités avancées de bash, et bien que l'utilisation supplémentaire de la mémoire de bash soit presque certainement insignifiante pour cette application, vous pouvez toujours écrire la ligne de hachage afin que ./run.sh exécute le script avec sh:

#!/bin/sh

Utilisation incorrecte de export

Le principal problème, à l'origine de votre deuxième message d'erreur et à la raison pour laquelle AptanaStudio3 ne s'exécute pas, est que vous utilisez export de manière incorrecte. La commande export n'exécute pas de commande. Donc, votre commande est interprétée comme une variable d’environnement elle-même.

  • export peut définir et exporter une variable d'environnement:

    export NAME=value
    
  • export peut également exporter une variable d'environnement (avec quelle que soit sa valeur actuelle):

    export NAME
    

export n'accepte pas cependant la syntaxe NAME=value command ou NAME command.

En supposant que votre objectif est d'exécuter la commande /home/andrea/Programmi/Aptana_Studio_3/AptanaStudio3 avec la variable UBUNTU_MENUPROXY définie et définie sur 0, , vous devez simplement supprimer le mot export:

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

C’est le moyen standard d’exécuter une commande avec un environnement modifié, à partir d’un shell.

export a pour objet d’exporter des variables dans les environnements de tous les processus enfants lancés ultérieurement (c’est-à-dire chaque commande exécutée à partir de votre script). Donc, exécuter export UBUNTU_MENUPROXY=0 sur sa propre ligne suivi de la commande AptanaStudio3, comme Shutupsquare le suggère , fonctionnera et aura le même effet, et constitue un moyen parfaitement et acceptable de le faire.

Je préfère la façon que j'ai suggérée ci-dessus ( sans export) car:

  • Sémantiquement, votre objectif n'est pas d'exporter quoi que ce soit, mais plutôt d'exécuter une commande unique avec un environnement modifié. Utiliser export peut être source de confusion pour les autres lecteurs de votre script (ou pour vous-même plus tard), ce qui est sans doute moins élégant.
  • Avec export, vous avez besoin de deux commandes. en utilisant le chemin sans cela, vous n’avez besoin que d’un seul.

Lecture facultative: la commande env fonctionne (en quelque sorte) comme vous essayiez d'utiliser export

Enfin, il existe une commande qui accepte la syntaxe NAME=value command. Cette commande est env . Il n'y a aucune raison de l'utiliser dans ce script de shell: sa fonction, dans cette utilisation de base, est de fournir (une partie de) le pouvoir d'un shell lors de l'exécution d'une commande avec un environnement modifié, et vous disposez déjà de ce pouvoir.

Cependant, dans certaines circonstances en dehors du script Shell, vous devrez peut-être définir une variable d'environnement pour une commande et exécuter cette commande (et effectuer ces opérations dans une seule commande). Dans les contextes où l'utilisation de la ligne VARIABLE=value command n'est pas prise en charge, vous pouvez utiliser:

env VARIABLE=value command

Vous n'avez pas besoin de ça ici cependant. Tous les shells de type Bourne (par exemple, sh, dash, bash, ksh, zsh) prennent en charge VARIABLE=value command.

10
Eliah Kagan

Devrait être #!/bin/bash. Je pense aussi que vous devriez avoir une nouvelle ligne à la fin de export UBUNTU_MENUPROXY=0.

#!/bin/bash

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