一部のプログラムはサブルーチンのTTY色を正しく渡しますが、他のプログラムがそうでないのはなぜですか?

一部のプログラムはサブルーチンのTTY色を正しく渡しますが、他のプログラムがそうでないのはなぜですか?

次のようにしてttyを色付けできます。

myscript.sh:

#!/bin/bash
echo -e "This is \033[0;31mRED\033[0m"

通常、他の「親」プログラムが子myscript.shプロセスとして実行されている場合は、カラーコードが正しく戻され、親プログラムを実行しているシェルは子プロセスの色を表示します。

何度も動作しません。 GNU Makeは反例です

ファイル生成:

foo:
    ./myscript.sh

私が実行すると、make foo出力は次のようになります

This is \033[0;31mRED\033[0m

何らかの理由でmake子プロセスの出力をエスケープする必要があるように感じます。

make誰もがそれを書いた人がアンチ機能を生成するためにコード(追加作業)を追加する必要があるため、これは驚くべきことだと思います。それとも、アプリケーションがmakettyのスイッチをオンにして、すべてが自動的にエスケープされるようにしますか?それでは、この動作を無視し、プログラムにmake子プロセスデータを変換せずにttyに渡すように強制できますか?それとも、各プログラムは独自の方法でこの動作を制御しますか?

答え1

問題は、スクリプトがPOSIXではないことに依存していることです。bash機能するがmake使用中/bin/shシェルの場合(例:Debian)、次のような他のプログラムです。dash(POSIX規格に準拠したシェル)

追加資料:

答え2

Thomasが答えで述べたように、使用されるシェルはmakeスクリプトを手動で実行するときに使用するシェルとは異なります。

通常、スクリプトが特定のシェルに固有の機能を使用している場合は、その特定のシェルをshebang行に配置する必要があります。

たとえば、

#!/bin/bash
echo -e "This is \033[0;31mRED\033[0m"

答え3

呼び出されるスクリプトは、組み込みファイルシステムではなくmakeファイルシステムを使用する必要があります。echo

/bin/echo -e "\033...

関連情報