Makefileからファイルにアクセスできません。

Makefileからファイルにアクセスできません。

私がするたびに

for f in data/*; echo $f; done

ターミナルはすべてのパスを正しく出力します。

ただし、上記の行をmakefileに追加すると、次のようになります。

test:
    for f in data/*; echo $f; done

次に実行すると、make testファイルを出力するのではなく、常に空の文字列を出力します。これはディレクトリ内のファイル/ディレクトリの数と同じ回数でこれを行うため、正しく繰り返されるように見えます。

なぜそんなことですか?

$$f編集:これは問題を解決しますが、$fそれを使用してコマンド時間を測定すると誤った出力が発生することがわかりました。time

編集#2:以下はtimeコマンドの例です。

生成されたファイルから: for f in data/ascending_order/*; do time echo $$f; done

data/ascending_order/01/
0.00user 0.00system 0:00.01elapsed 0%CPU (0avgtext+0avgdata 804maxresident)k
0inputs+0outputs (0major+232minor)pagefaults 0swaps

ターミナルから for f in data/ascending_order/*; do time echo $f; done

data/ascending_order/01

real    0m0.001s
user    0m0.000s
sys     0m0.000s

答え1

最初の問題(echo $f)はMakefileからエスケープすることによって発生します$f作る代わりに変数シェル変数を使用すると、その変数が空になるように拡張され、シェルがecho各ファイルに対して空白行を持つ単一の変数を実行します。解決策は$aを2倍にすること、つまりuseを使用してエスケープすることです$$f。この場合、makeはsの1つを消費し、必要に応じて$シェルaを渡します。$f


2番目の質問(output format time)に関して見ているのは、timebash組み込みコマンドと外部コマンドの間の出力形式の違いです/usr/bin/time

makeはMakefileのコマンドをに渡して実行します/bin/sh。一部のLinuxディストリビューション(主にDebianとUbuntu)は、組み込みdashコマンドを実装せずtimeにこのように外部コマンドを呼び出すより簡単なシェルです。状況。

timebashを使用してMakefileからコマンドを実行するようにmakeに指示すると、bash出力を取得できます。これはMakefileで変数を割り当てることによって行うことができます。

SHELL = /bin/bash

関連情報