電子書籍の厳選無料作品が豊富!

CentOS 6.5 32bitにてmakefileの勉強をしています。

Managing Projects with GNU Make, 3rd Editionの中で、以下のようなmakefileの記載がありました。
-----
%.d: %.c
$(CC) -M $(CPPFLAGS) $< > $@.$$$$
-----

上記の$@.$$$$ですが、$が4つ並ぶことでランダムの数字が実行時に与えられるというのは理解できました。

本やネットでこの$$$$の説明文を探すときは、どういうキーワードで探すのがいいのでしょうか?

3桁や2桁の数字も同じように$を用いて取得できるかなど知りたいと考えています。自分で実際に$@.$$$などした限りではうまく取得できていない現状です。

A 回答 (3件)

こういう記号って、検索だと難しいですよね。


ということで、まずは、マニュアルを読むことです。

https://www.gnu.org/software/make/manual/

文章内を $$ で検索すると何箇所かヒットしますが
https://www.gnu.org/software/make/manual/make.ht …
> This special significance of ‘$’ is why you must write ‘$$’ to have the effect of a single dollar sign in a file name or recipe.

ルールに $ という文字を記述したい場合は、 $$ としなければならない、とあります。
$$$$ というのは、 コマンドラインとしては $$ という文字列になります。

コマンドを解釈するのはシェルです。
シェルでは$は変数(パラメータ)の展開に使われます。
$! などと、記号が使われることもあります。(組み込みの特殊変数です)
では、$$ は無いか、と調べると

http://linuxjm.sourceforge.jp/html/GNU_bash/man1 …
> 特殊パラメータ
シェルはいくつかのパラメータを特別扱いします。 このようなパラメータは参照されるだけであり、 値を代入することは許されません。
> $
> シェルのプロセス ID に展開されます。 () を使ったサブシェルの内部では、$ はサブシェルではなく、 現在のシェルのプロセス ID に展開されます。

ということで
・ $$$$ は、 $$ としてシェルで解釈される
・$$はシェルでプロセスIDに展開される。 プロセスIDは実行のたびに変化するので、ランダムに見える。
ということがわかります
    • good
    • 1
この回答へのお礼

回答ありがとうございます。

マニュアルのリンク情報ありがとうございます。今後、このマニュアルも読んでいきたいと思います。

> $$$$ というのは、 コマンドラインとしては $$ という文字列になります。
なるほどです。

「特殊パラメータ」というキーワードで探せば、関連する情報にたどり着けたのですね。

勉強になりました。ありがとうございます。

お礼日時:2014/02/18 14:09

>$が4つ並ぶことでランダムの数字が実行時に与えられるというのは理解できました。



違います。
ランダムの数字じゃなくて、その行を実行するシェルのプロセス番号です。

>本やネットでこの$$$$の説明文を探すときは、どういうキーワードで探すのがいいのでしょうか?

まずは、Makefileの書き方を調べると、コマンドの行に $ を書きたいときは $$ と2つ重ねるという事がわかると思います。
つまり $$$$ とMakefileのコマンド行に書くと、$$ がシェルに渡されます。
その $$ をシェルがどう解釈するかは、シェルのマニュアルに書いてあります。man bashとか。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。


> ランダムの数字じゃなくて、その行を実行するシェルのプロセス番号です。

なるほどです。
シェル上のecho $$をする限りでは、同じ値になり、makefileで$$$$で実行すると違う値になるのは、シェルのプロセス番号だったからなのですね。合点がいきました。

> つまり $$$$ とMakefileのコマンド行に書くと、$$ がシェルに渡されます。
そうなのですね。

Makefileの記載がどうシェル上で処理されるかの理解がまだまだ不足しています。man bash、makeのマニュアルなど読んでいこうと思います。

お礼日時:2014/02/18 14:12

>上記の$@.$$$$ですが、$が4つ並ぶことでランダムの数字が実行時に与えられるというのは理解できました。



違います。
Makefile中に書かれる
$アルファベット1文字の変数名
$(変数名)
は変数を表しますが、$$と書いた場合、文字$を表します。
また実行しようとするコマンド中に文字$などが含まれていた場合(他にも条件はあります)、
makeから直接コマンドを実行せずに /bin/sh 経由でコマンドは実行されます。
その際 $$$$ は、$$ として /bin/sh に渡されます。
ですのでシェル変数の $$ は何なのか調べてみてください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

Makefile内の$$$$はシェルでは$$となるのですね。
$つきが変数というのと関連して、理解できました。

勉強になりました。ありがとうございます。

お礼日時:2014/02/18 14:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!