私がするたびに
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
)に関して見ているのは、time
bash組み込みコマンドと外部コマンドの間の出力形式の違いです/usr/bin/time
。
makeはMakefileのコマンドをに渡して実行します/bin/sh
。一部のLinuxディストリビューション(主にDebianとUbuntu)は、組み込みdash
コマンドを実装せずtime
にこのように外部コマンドを呼び出すより簡単なシェルです。状況。
time
bashを使用してMakefileからコマンドを実行するようにmakeに指示すると、bash出力を取得できます。これはMakefileで変数を割り当てることによって行うことができます。
SHELL = /bin/bash