GNU Makefileのプロセスの置き換え

GNU Makefileのプロセスの置き換え

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/shbashシステムに存在する可能性がありますが、そのように呼び出されるshbash、POSIXモードで実行されます(定義POSIXLY_CORRECT済みまたは起動済みのように--posix)。

このモードではプロセス置換はありません。

解決策:

  1. 明示的な一時ファイルを使用してください。

    all:
        command1 >tmpfile
        command2 | diff tmpfile -
        rm -f tmpfile
    
  2. bash -cインラインスクリプトを使用してください。

    all:
        bash -c 'diff <(command1) <(command2)'
    
  3. Makefile変数を次のように定義します(またはSHELLシステムへの/bin/bash任意のパス)。bash

    SHELL=/bin/bash
    

移植性が必要な場合は、最初のソリューションを選択してください。への依存を受け入れることができる場合は、bash2番目のものを選択してください。 GNU以外の実装について別途気にする必要がない場合は、make3番目の実装を使用してください。


設定関連SHELL:POSIX標準は、Makefileの実行可能ファイルがsystem().cライブラリ関数によって呼び出されるべきであると規定していますmake。この関数は環境変数の使用を保証しませんSHELL(実際の標準ではこれをお勧めしません)。また、標準では、Makefile変数の設定がSHELL影響を与えてはならないことについて詳しく説明しています。環境変数 SHELL。しかし、私が知っているほとんどの実装では、makeMakefile変数がコマンドをSHELL実行するために使用されます。

の提案makeこのユーティリティの基本原理使用することですbash -c

他の実装によって提供される歴史的MAKESHELL機能およびmake関連機能は省略される。一部の実装では、ユーザーがコマンドmakeの実行に使用されるシェルをオーバーライドできるようにするために使用されます。これは混乱しています。移植性のために、makemakefile 作成者はシェルを選択する必要があります。さらに、メイクファイルの作成者は代替シェルの使用を要求することはできず、まだメイクファイルを移植可能であると見なします。代替シェルを指定するメカニズムは標準化できますが、既存の実装はこのメカニズムに同意せず、makefile作成者はすでにターゲットルールにシェル名を指定して代替シェルを呼び出すことができます。

python -c "foo"

おすすめ記事