まず、このmakefileは機能しません
all:
A=$(shell stat -c %Y test1);\
echo "A is $$A";\
touch test1;\
B=$(shell stat -c %Y test1);\
echo "B is $$B";\
if (($$A<$$B)); then echo true; fi
シェルでの出力:
$ make
A=1513082575;\
echo "A is $A";\
touch test1;\
B=1513082575;\
echo "B is $B";\
if (($A<$B)); then echo true; fi
A is 1513082575
B is 1513082575
時間は変わらず、touch test1
あとで実行されたA=$(shell stat -c %Y test1);
と思いますB=$(shell stat -c %Y test1);
そしてこれはうまくいくようです:
all:
A=$(shell stat -c %Y test1);\
echo "A is $$A";\
C=$(shell touch test1);\
B=$(shell stat -c %Y test1);\
echo "B is $$B";\
if (($$A<$$B)); then echo true; fi
シェルでの出力:
$ make
A=1513083955;\
echo "A is $A";\
C=;\
B=1513084224;\
echo "B is $B";\
if (($A<$B)); then echo true; fi
A is 1513083955
B is 1513084224
true
しかし$(shell touch test1)
、私は望んでいません、この機能を実装する他の方法はありますか?
$(shell...)
あなたのレシピでは、makeが展開される前にレシピが実際にシェルに渡されます。したがって、という名前のファイルがtest1
存在し、そのタイムスタンプがである1513082575
場合、makeは最初にレシピを次のように展開します。
A=1513082575;\
echo "A is $A";\
touch test1;\
B=1513082575;\
echo "B is $B";\
if (($A<$B)); then echo true; fi
これをシェルで実行すると、得られた結果が得られます。本当にタイムスタンプをレシピで取得したい場合は、以下を使用しないでください$(shell...)
。
all:
A=$$(stat -c %Y test1);\
echo "A is $$A";\
touch test1;\
B=$$(stat -c %Y test1);\
echo "B is $$B";\
if ((A<B)); then echo true; fi
注1:$
シェル用に保持したいmakeを2倍にして、展開をエスケープします($$
)。
注2:bashマニュアルの算術評価セクションから:
式内では、パラメーター展開構文を使用せずに、シェル変数を名前で参照することもできます。
したがって、bashでは、次の理由でif((A<B))...
同じことをif(($A<$B))...
行い、望ましいです。
$
レシピでエスケープする必要はありません、この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加