1

通常、シェル スクリプトから、次の行に沿って、出力がファイルにリダイレクトされているかどうかを検出できます。

if [ -t 1 ]; then echo "shell"; fi

しかし、私はメイクファイルの中でこれをやりたいと思っています。つまり、知る限り、それを行う唯一の方法は次のとおりです。

ifeq ($(shell if [ -t 1 ]; then echo "1"; fi),1)
## in shell
endif

ただし、出力がファイルにリダイレクトされるかどうかに関係なく、これは常に当てはまるようです。私はそれがどのよう$(shell...)に実装されるかにかかっていると思います。私の質問は、make出力がファイルにリダイレクトされているかどうかを知るためにテストできるものはありますか?

少し背景を説明すると、私のメイクファイルは多くの有用な出力を生成します。物事をもう少し明確にするために、テキストの色付けを使用します。コンソールではこれで問題ありませんが、Hudson で同じビルド ジョブを実行すると、出力 (リダイレクトされます)ファイルへの)にはすべての制御文字が含まれています...だから、ファイルがリダイレクトされた場合、makeのすべてのカラーコードを無効にしたいのです。

4

1 に答える 1

1

$(shell ...)の出力$(shell ...)常にリダイレクトされるため、これには使用できません。実行の全体的なポイントは、その$(shell ...)出力を取得するための make であるためです。通常、stderr が tty であるかどうかを確認できます。これは、人々が通常両方を同時にリダイレクトすることを前提としています。ただし、場合によっては、これは誤った仮定になる可能性があります。

それ以外には、make 内からこのチェックを実行する簡単な方法がわかりません。チェックは make レシピ内から行う必要があります。これは、make が stdout を変更せずにシェルを呼び出す唯一の場所であるためです。ただし、レシピ内からメイクファイル変数などを変更することはできません。

自動生成されたインクルード ファイルを使用して、標準出力が端末であるかどうかを確認し、インクルードされた makefile に変数の割り当てを書き込むという、本当に嫌なハックを考え出すことができるかもしれません。次に、このインクルードされた makefile を make の呼び出しごとに 1 回だけ再構築するようにします。これは簡単ではありませんが、おそらく実行できるでしょう。ただし、これには、この変数を設定するためだけに、毎回 make を完全に再実行する必要があります。

もちろん、make を直接実行する代わりに人々が実行するシェル ラッパーを提供することもできます。これは、stdout が tty であるかどうかをテストし、結果に基づいて変数を割り当てて make を呼び出します。

于 2013-07-19T11:36:32.387 に答える