2016-10-23 4 views
1

Makefileのシェルをカスタマイズしたいが、問題が発生している。ここにMWEがあります。私はMakefile、MakefileでSHELLをカスタマイズする(SHELL = my_shell.shを設定する)

SHELL=./my_shell.sh 

all: abc def 

abc: 
     touch abc 

def: 
     touch def 

clean: 
     rm -f abc def 

と簡単なカスタムスクリプトmy_shell.shを持っています。

#!/bin/bash 
eval $* 

私は必ずchmod +x my_shell.shを実行しました。その後、makeと入力したときにエラーが発生しました。

make[3]: Entering directory `<CONFIDENTIAL>' 
touch abc 
./my_shell.sh: line 2: eval: -c: invalid option 
eval: usage: eval [arg ...] 
make[3]: *** [abc] Error 2 
make[3]: Leaving directory `<CONFIDENTIAL>` 

私は-cオプションを取り除くために苦労しています。 .SHELLFLAGS=''の設定は機能していないようです。

答えて

3

まず、シェルではなく、行いません。シェルクォートストリッピング)。

第2に、.SHELLFLAGSという変数がGNU make 3.82で追加されました。バージョンがそれよりも古い場合は動作しません。あなたが3.82以上を持っていれば、それは動作します(私はそれを試しました)。

最後にJean-Françoisが指摘するように、コマンドがスペースをエスケープすると問題が発生します。しかし、"[email protected]"を使用する彼のソリューションは、コマンド全体が単一の文字列として認識されるため、そのまま動作することはできません。スクリプトの

より信頼性の高い実装は次のようになります。

#!/bin/bash 
exec /bin/bash "[email protected]" 

そして.SHELLFLAGSを変更しないでください。さもないと、空にしてスクリプトを作成する.SHELLFLAGSを設定してください:

#!/bin/bash 
exec /bin/bash -c "[email protected]" 
2

SHELLは、bashまたはcshのようなシェルコマンドが必要です。 makeは、最初の引数(コマンドオプション)として-cを使用してシェルコマンドを呼び出します。

すべての引数を直接evalコマンドに渡すので、そのエラーが発生します。

shiftを使用して、使用していない最初の-c引数をスキップしてください。

#!/bin/bash 
shift 
eval $* 

と引数がスペースを持っている場合は多分あなたは"[email protected]"代わりの$*必要があります。あなたが実際に文字列リテラル''(作るに変数を設定している引用符を追加することにより、空の使用

.SHELLFLAGS = 

にメイク変数を設定したい場合は

+1

あなたと@MadScientistの両方からソリューションは、私の小さな例のために働いたので、私は、私は正式に両方の答えを支持することができることを望みます。ありがとう! – landau

+1

問題はない、私の答えは2倍upvoted、それは十分です。とにかくもう一方の答えは良いです。 –