と:
FILES = $(shell ls)
そのall
ようにインデントされている、それはビルドコマンドです。したがって、これは展開して$(shell ls)
からコマンドを実行しようとしますFILES ...
。
場合FILES
ことになっているmake
変数、これらの変数は、レシピの部分、例えば外に割り当てる必要があります。
FILES = $(shell ls)
all:
echo $(FILES)
もちろん、その手段FILES
「からの出力に設定されますls
」前の.tgzファイルを作成するコマンドのいずれかを実行しています。(Kazは変数が毎回再展開されることに注意しているので、最終的には.tgzファイルが含まれます。一部のmakeバリアントはFILES := ...
、効率や正確さのためにこれを回避する必要があります。1)
FILES
がシェル変数であると想定されている場合は設定できますが、スペースなしで引用符で囲んでshell-eseで行う必要があります。
all:
FILES="$(shell ls)"
ただし、各行は個別のシェルによって実行されるため、この変数は次の行まで存続しないため、すぐに使用する必要があります。
FILES="$(shell ls)"; echo $$FILES
シェルが*
最初に展開するので(そして他のシェルglob式も)、これは少しばかげています。
echo *
あなたのシェルコマンドとして。
最後に、一般的な規則として(この例には実際には適用されません):コメントのエスペラントの注釈として、からの出力の使用はls
完全に信頼できません(一部の詳細はファイル名に依存し、時にはのバージョンにも依存しますls
。ls
出力のサニタイズを試みるいくつかのバージョンある場合には)。したがって、l0b0とイデリックノートとして、GNU makeを使用$(wildcard)
し$(subst ...)
ている場合は、make
それ自体を使用してすべてを実行できます(「ファイル名の奇妙な文字」の問題を回避します)。(sh
メイクファイルのレシピ部分を含むスクリプトでは、もう1つの方法は、find ... -print0 | xargs -0
空白、改行、制御文字などのつまずきを回避するために使用することです。)
1 GNU Makeのドキュメントには、POSIX make ::=
が2012年に割り当てを追加したことがさらに記載されています。このためのPOSIXドキュメントへのクイックリファレンスリンクは見つかりません。また、割り当てがmake
サポートされているバリアントもすぐにはわかりません。::=
:=
私が知る限り、すべての最新のGNUおよびBSDバリアントを含む、いくつかのバリアントでVAR := $(shell command args...)
も綴られることに注意してください。これらの他の変形はありませんので、使用して両方が短いことで優れているとより多くの変種で働きます。VAR != command args...
make
$(shell)
VAR != command args...
ls
withsed
やcutなど)を使用し、その結果をrsyncやその他のコマンドで使用したいと思います。長いコマンドを何度も繰り返す必要がありますか?結果を内部のMake変数に保存できませんか?