web-dev-qa-db-ja.com

この単純なbashスクリプトを実行しようとすると、このエラーが発生するのはなぜですか?

Ubuntu 14.04でAptana Studioを正しく実行するために このチュートリアル を実行しています。

したがって、Oracle JREをインストールし、最終的にAptanaを実行する必要があるこのrun.shファイルを作成しました。

!/bin/bash

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

問題は、シェルでこのスクリプトを実行しようとすると、次のエラーメッセージが表示されることです。

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

どうして?私は何が欠けていますか?この問題を修正するにはどうすればよいですか?

5
AndreaNobili

2つのエラーがあります。要するに、これは私が提案する特定の修正です(詳細は以下):

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

悪いHashbangライン

Shutupsquareの発言 のように、 hashbang line技術的詳細 )は#!ではなく!で始まる必要があります。

これは、2つのエラーメッセージの最初の原因であり、スクリプトが./run.shとして実行されるのを防ぎますが、スクリプトがAptanaStudio3の実行に失敗するわけではありません(hashbang行は不要です) sh run.sh呼び出し構文の場合)。

ところで、sh run.shを実行すると、インタープリターとして sh を指定してスクリプトが実行されます。ただし、hashbang行#!/bin/bashでは、./run.shを実行すると、インタープリターとして bash を指定してスクリプトが実行されます。このスクリプトは、bashの高度な機能にはまったく依存しません。また、bashの追加メモリ使用量はこのアプリケーションにとってほとんど重要ではありませんが、./run.shshを使用してスクリプトを実行するように、hashbang行を記述することもできます:

#!/bin/sh

exportの誤った使用

2番目のエラーメッセージの原因であり、AptanaStudio3の実行に失敗する主な問題は、exportを誤って使用していることです。 exportコマンドはコマンドを実行しません。そのため、コマンドは環境変数として解釈されています。

  • exportは、環境変数を設定およびエクスポートできます。

    export NAME=value
    
  • exportは、(現在の値が何であれ)環境変数をエクスポートすることもできます。

    export NAME
    

ただし、exportは、notNAME=value commandまたはNAME command構文を受け入れません。

/home/andrea/Programmi/Aptana_Studio_3/AptanaStudio3変数が定義され、UBUNTU_MENUPROXYに設定されたコマンド0を実行することを目標としている場合、Word exportを完全に削除する必要があります

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

これは、シェルから変更された環境でコマンドを実行する標準的な方法です。

exportの目的は、その後起動されるすべての子プロセス(つまり、スクリプトから実行されるすべてのコマンド)の環境に変数をエクスポートすることです。したがって、 Shutupsquareが示唆する のようにexport UBUNTU_MENUPROXY=0コマンドが続く独自の行でAptanaStudio3を実行すると、機能し、同じ効果があり、やれ。

私は上で提案した方法を好む(withoutexport):

  • 意味的に、あなたの目標は何もエクスポートすることではなく、変更された環境でsingleコマンドを実行することです。 exportを使用すると、スクリプトを読んでいる他の人(または後で自分自身)に混乱を招く可能性があります。
  • exportでは、2つのコマンドが必要です。それなしの方法を使用すると、必要なのは1つだけです。

オプションの読み取り:envコマンドは、exportを使用しようとしていた方法(のような)で動作します

最後に、そこにはisNAME=value command構文を受け入れるコマンドがあります。このコマンドは env です。このシェルスクリプトで使用する理由はありません。その基本的な使用法では、その機能は、変更された環境でコマンドを実行する際にシェルの力(の一部)を提供することであり、既にその力を持っています。

ただし、状況によっては、シェルスクリプトのoutsideの場合、コマンドの環境変数を設定し、そのコマンドを実行する必要があります(そして、これらのことを1つのコマンドで実行します) 。行VARIABLE=value commandの使用のみがサポートされていないコンテキストでは、次を使用できます。

env VARIABLE=value command

ただし、ここでは必要ありません。すべてのBourneスタイルのシェル(shdashbashkshzshなど)はVARIABLE=value commandをサポートします。

10
Eliah Kagan

#!/bin/bashである必要があります。また、export UBUNTU_MENUPROXY=0の最後に改行が必要だと思います。

#!/bin/bash

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