Bashプロンプトで擬似ファイルを使用してdiffを実行できます。
diff <(echo test) <(echo test)
Makefileにそのまま追加すると失敗します。
all:
diff <(echo test) <(echo test)
エラー(ヒント:/bin/shはこのシステムの/bin/bashを指します):
/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `diff <(echo test) <(echo test)'
どういう意味ですか?一時ファイルを使用せずに2つの出力を比較する方法はありますか?
ベストアンサー1
/bin/sh
bash
システムに存在する可能性がありますが、そのように呼び出されるsh
とbash
、POSIXモードで実行されます(定義POSIXLY_CORRECT
済みまたは起動済みのように--posix
)。
このモードではプロセス置換はありません。
解決策:
明示的な一時ファイルを使用してください。
all: command1 >tmpfile command2 | diff tmpfile - rm -f tmpfile
bash -c
インラインスクリプトを使用してください。all: bash -c 'diff <(command1) <(command2)'
Makefile変数を次のように定義します(または
SHELL
システムへの/bin/bash
任意のパス)。bash
SHELL=/bin/bash
移植性が必要な場合は、最初のソリューションを選択してください。への依存を受け入れることができる場合は、bash
2番目のものを選択してください。 GNU以外の実装について別途気にする必要がない場合は、make
3番目の実装を使用してください。
設定関連SHELL
:POSIX標準は、Makefileの実行可能ファイルがsystem()
.cライブラリ関数によって呼び出されるべきであると規定していますmake
。この関数は環境変数の使用を保証しませんSHELL
(実際の標準ではこれをお勧めしません)。また、標準では、Makefile変数の設定がSHELL
影響を与えてはならないことについて詳しく説明しています。環境変数 SHELL
。しかし、私が知っているほとんどの実装では、make
Makefile変数がコマンドをSHELL
実行するために使用されます。
の提案make
このユーティリティの基本原理使用することですbash -c
:
他の実装によって提供される歴史的
MAKESHELL
機能およびmake
関連機能は省略される。一部の実装では、ユーザーがコマンドmake
の実行に使用されるシェルをオーバーライドできるようにするために使用されます。これは混乱しています。移植性のために、make
makefile 作成者はシェルを選択する必要があります。さらに、メイクファイルの作成者は代替シェルの使用を要求することはできず、まだメイクファイルを移植可能であると見なします。代替シェルを指定するメカニズムは標準化できますが、既存の実装はこのメカニズムに同意せず、makefile作成者はすでにターゲットルールにシェル名を指定して代替シェルを呼び出すことができます。
python -c "foo"