/bin/sh
bash
システム上にある可能性がありますが、として呼び出されるとsh
、bash
POSIXモードで実行されます(POSIXLY_CORRECT
定義されている場合、またはで開始された場合--posix
)。
このモードでは、プロセス置換は存在しません。
ソリューション:
all:
command1 >file1
command2 >file2
diff file1 file2
rm -f file1 file2
代替:
all:
bash -c "diff <(command1) <(command2)"
または、Makefile変数SHELL
を/bin/bash
次のように定義します。
SHELL=/bin/bash
移植性が必要な場合は、最初のソリューションを使用してください。への依存に問題がない場合はbash
、2番目を選択します。さらにmake
、GNU以外の実装について気にする必要がない場合は、3番目の実装を使用します。
設定についてSHELL
:POSIX標準では、Makefileの実行可能ファイルは、system()
Cライブラリ関数を使用して呼び出す必要があると規定されていmake
ます。この関数は、SHELL
環境変数の使用が保証されていません(実際には、標準で使用することはお勧めしません)。標準では、Makefile変数の設定SHELL
が環境変数に 影響を与えてはならないということもありますSHELL
。make
ただし、私が知っているほとんどの実装では、Makefile変数SHELL
を使用してコマンドを実行します。
ユーティリティの根拠でmake
の提案は、使用することbash -c
です:
履歴MAKESHELL
機能、および他のmake
実装によって提供される関連機能は省略されました。一部の実装では、make
コマンドの実行に使用されるシェルをユーザーがオーバーライドできるようにするために使用されます。これは混乱を招きました。ポータブルのmake
場合、シェルはmakefileライターが選択する必要があります。さらに、Makefileライターは、代替シェルを使用するように要求することはできませんが、Makefileを移植可能と見なします。代替シェルを指定するためのメカニズムを標準化することは可能ですが、既存の実装はそのようなメカニズムに同意しておらず、メイクファイル作成者はターゲットのルールでシェル名を指定することですでに代替シェルを呼び出すことができます。例えば:
python -c "foo"
bash
一時ファイルを使用せずに、Makefileまたはdiff問題の他のソリューションで呼び出す方法はありますか?