• ベストアンサー

シェルスクリプトの書き方

あるMakefileを作ったのですが、Makefileの中で同時にあるパスを通す処理を追記したいです。Makefileではタブを入れればシェルスクリプトと同様に普通にUNIXコマンドを実行出来るようなので、以下のように記載したのですが、動作しませんでした。どのようにすれば対処出来るでしょうか。 Makefileの内容 ... [tab]LD_LIBRARY_PATH=~/ [tab]export LD_LIBRARY_PATH ...

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

シェルでは ; を使う事で複数行を一行に書く事ができます。 Makefileで指定した "[tab]コマンド行" は一行ずつmakeコマンドに よって読み込まれ、新しいシェルを起動してその上で実行されます。 一行ごとなので、 ; を使いマルチステートメント化すれば、複数 命令を一つのシェルへ渡します。 export コマンドは指定した変数を環境変数として扱うフラグ設定 コマンドですから export LD_LIBRARY_PATH とすれば LD_LIBRARY_PATH が環境変数として扱われる様になります。 (マークしなければ単なるシェル変数[プロセスの持っている環境で ないので子プロセスで実行するコマンドへは引き継がれない]のまま です) ※ forkでコピーを作成した段階までは参照可能ですがexecで コマンドをロードした時初期化されます。 exportコマンドはマークと値の設定を同時にもできるので 結果的に下記3つの処理は同じ事(LD_LIBRARY_PATHを環境変数として 扱うようマークし、LD_LIBRARY_PATHの内容を~/に設定する)となり ます。 1. export LD_LIBRARY_PATH=~/ 2. LD_LIBRARY_PATH=~/ export LD_LIBRARY_PATH 3. export LD_LIBRARY_PATH LD_LIBRARY_PATH=~/ exportコマンドや変数設定は標準シェル系シェルの内部(builtin) コマンドです。 ※ 外部コマンドとして実装されてないのはコマンド起動時に作成 した環境(サブプロセス)で操作しても元の環境に反映できないから。 Makefileの内容が ... [tab]export LD_LIBRARY_PATH=~/ [tab]CommandA [tab]CommandB ... では、CommandAやCommandBは 『export LD_LIBRARY_PATH=~/』が 実行されてない状態で動きますが [tab]export LD_LIBRARY_PATH=~/ ; CommandA [tab]LD_LIBRARY_PATH=~/ CommandB 上記例の CommandA や CommandB 用例を用いる事でLD_LIBRARY_PATH=~/ 環境下で CommandA や CommandB を実行する事が可能です。 別スクリプト化については、makeで定義している変数を使う場合には その変数群を渡してやる必要はありますので、それが煩雑にならない 場合には使えば良いでしょう。

redhat_001
質問者

お礼

よくわかりました。有り難うございました。

その他の回答 (2)

  • fmysh
  • ベストアンサー率79% (27/34)
回答No.2

Makefile のコマンド行はシェルスクリプトと等価ではありません。 シェルスクリプトは初めから終わりまで一つのシェルが面倒みますが、 Makefile のコマンド行では1行毎に子プロセスを起こすので、関連のある処理は [tab]LD_LIBRARY_PATH=${HOME}/ ; \ [tab]export LD_LIBRARY_PATH; \ ... といった具合に継続した1行として、まとめて子シェルに渡さなければなりません。 for ループを廻したりするときによくやる落とし穴です。 環境をいじるということに関しては、 GNU make なら export コマンドが効きますが、 コマンド行にではなく、変数セクションに置きます。 これは 親 make の環境自体をを変えて、それを子プロセスに引き継がせます。 LD_LIBRARY_PATH=${HOME} export LD_LIBRARY_PATH all: [tab]printenv LD_LIBRARY_PATH 一般的には、環境変数を指定したいのならば、シェルスクリプトの中にコマンド列共々書いておき、それをmake から呼び出せば済むと思います。

redhat_001
質問者

お礼

ご回答有り難うございました。

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

Makefile のコマンド指定では、各行個別に子プロセスを立ち上げコマンドが実行されます。 ですが、呼び出された子プロセス側での環境変数の操作は、親プロセスには影響ありません。 結果として、環境変数をいじる操作をしても、次行移行のコマンド実行には反映されないことになります。 環境変数を変えたい場合は、 [tab]LD_LIBRARY_PATH=~/ 実行したいコマンド といった感じで、環境変数の操作とコマンド実行を同じ行に入れてください。 (シェルスクリプトの文法として、 ○=△ は、環境変数の代入ですが、 ○=△ □ のように=以降に空白で区切られた記述があった場合、 環境変数の設定「○=△」を行った状態で、コマンド「□」を実行します。)

redhat_001
質問者

お礼

ご回答有り難うございました。