• ベストアンサー

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

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

  • BSD系OS
  • 回答数3
  • ありがとう数13

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

  • ベストアンサー
回答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
質問者

お礼

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

関連するQ&A

  • perlスクリプト内でシェルコマンドを実行するには??

    タイトル通りなのですが、perlスクリプト内でシェルコマンドを実行させる方法が分からなく、困っています。 実行したいシェルコマンドはUNIXのcrontab なのですが・・。 また、perlスクリプト内以外でシェルコマンドを実行する方法はあるのでしょうか?? どなたか分かる方いらっしゃいましたらご教授いただけると幸いです。よろしくお願いします。

    • ベストアンサー
    • Perl
  • シェルスクリプトとパワーシェルスクリプトに変換したい

    UNIXで運用しているシェルスクリプトをマイクロソフトのパワーシェルで動作するようなシェルに書き換えたいのですが、下記のようなperlプログラムを起動している箇所はどのように扱えばよいのでしょうか。 /usr/local/ap/phone_book/edit_ms008.pl ms008.dat > ld_ms008.txt if [ $? -ne 0 ] then echo "abnormal terminated!\n" exit1 fi 「ms008.dat」をインプットにして「edit_ms008.pl」を実行して、 「ld_ms008.txt」をアウトプットするというものです。 どなたかご存知の方、ご教示よろしくお願いいたします。

  • Linuxシェルスクリプトを新しいコマンドにしたい

    Linux初級者です。よろしくお願いします。 OSにFedora Core 10, シェルにtcshを使用しています。 よく使用するコマンドを、まとめて一括で実行するように、 新しいコマンドを作成したくて、次のようなことをしていたのですが (1)ホームディレクトリにmybinというディレクトリを作成してPATHを通す。 (2)newbin1という以下の内容のシェルスクリプトを作成して、~/mybinに置いておく。 ================================== #!/bin/tcsh -f date #実行コマンド例1 echo $PATH #実行コマンド例2 ================================== (3)chmodコマンドでファイルに実行権限を与える。 上記のような方法で、作成したシェルスクリプト(newbin1)を PATHの通ったディレクトリ(~/mybin)に置いて、 > newbin1 とコマンドを呼び出しても、 "newbin1: コマンドが見つかりません" というエラーになってしまいます。 > which newbin1 とすると、ちゃんとファイルのパスが表示されるのですが、 *********************************************************** 自分で作成したシェルスクリプト(newbin1)を、 新しいコマンドとして認識させるにはどのようにすればよいのでしょうか。 また、そもそもシェルスクリプトを新しいコマンドにすることが 不可能だったりするんでしょうか? ************************************************************ 一括で実行したいコマンドが多い場合に、aliasで割り当てるのが大変なので、 できればaliasコマンドは使わずにできる方法を探しています。 基本的な質問かもしれませんが、よろしくお願い致します。

  • シェルスクリプトについて

    とあるUNIXサーバが1台あるとします。 でそのマシン上の管理プログラムが同一マシン上にある 「シェルスクリプト(bash)」をキックするとします。 となるとそのシェルスクリプトの実行者(?)は Unixにログオンしているユーザーになるのでしょうか?。 目的としてはそのログインしているユーザーの環境変数 をシェルから参照したいのですが・・ 考え方がWindowsなもので。。すみませんが よろしくお願いします。

  • シェルスクリプトのbashとperlについて

    シェルスクリプトのbashとperlについて 今さら気づいたのですが、PerlもUNIXのコマンドやシェルスクリプトとして使用できるということでしょうか。 RubyやPHPをUNIXのコマンドやシェルスクリプトとして使用することはできますでしょうか。 学ぶとしたら、bashとPerlのどちらが良いでしょうか。 また、シェルスクリプトはどんな用途や利点がありますでしょうか。 Webアプリケーションによるバックアップやログをタイマーでセットして自動的に取得したりすることは可能でしょうか。

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

    すみません、シェル初心者なのですが、急を用してまして質問させて頂きました。 シェルスクリプトで コマンドを実行する前に他のユーザにスイッチしてから 実行するというのを実現したいのですが・・・ #!/bin/csh コマンド1 コマンド2 ・・・ とコマンド1の前に su コマンドを実行させたいのですが、 パスワードを入力する際、対話式なので どう書いてよいか分かりません。 よろしくお願いします。

  • sudoでのシェルスクリプト実行

    ユーザに、sudoで実行してもらいたいシェルスクリプトがあります。 sudoで実行しなかった場合、「sudoで実行してください」 というような警告文を表示し、処理を実行せずに終了し、 sudoで実行した場合のみ、処理を行ないたいです。 こうした動作を実現するには、シェルスクリプトに どういった記述を追記すればいいでしょうか? 環境はMacOSXです。よろしくお願いします。

  • シェルスクリプト内のcdで、カレントディレクトリを変えるには?

    シェルスクリプト内のcdコマンドで、カレントディレクトリを変えるにはどうしたらいいか?をどうか教えて下さい。 MS-DOSのバッチファイル内で"cd XXXXX"と書き実行した時の動作を、UNIX(CygWin)環境でも行いたいです。 が、シェルスクリプトは(サブシェルで動く為)カレントディレクトリが変わってくれません。aliasコマンド等でいろいろ実験しましたが、DOSバッチファイルのように「バッチファイル単体でディレクトリ移動が出来る方法」を探し出せませんでした。 極めて初歩的とは存じますが、どうか宜しくお願い致します。

  • シェルスクリプトをローカルで動作させるには

    cronジョブが使えるレンタルサーバーを使用しており、cronジョブから起動するshスクリプトを作ろうと思っています。 そこでシェルスクリプトを簡単に書こうと思っているのですが、プログラムはphpしかわかりません。勉強するためにはローカルで実行できる環境が必要だと思っています。 ネットでよく調べてみたのですが、シェルスクリプトをローカルで動作させる方法がわかりません。コマンドプロンプトから実行できたりしないんでしょうか?

  • UNIXシェルスクリプト

    お世話になります。 会社でUNIXシェルスクリプトを用いて残業申請自動送信メールの作成をしています。 下記のフローで作成したのですが、端末エミュレータを切るとjobが消えてしまい困っています。 バックグラウンドで実行したのですが、実行されませんでした。 回答よろしくお願いします。 at(指定時刻にメール送信)→sleep(来週の頭になるまで待つ)→goto(最初に戻る) と無限にatコマンドを週一回実行するスクリプトです。