2016-03-23 12 views
0

WindowsでGNU Make 3.81を使うのは非常に基本的な問題です。私は何か非常に愚かなことをしているに違いないと思いますが、ここの誰かがそれを数ミリ秒で指摘してくれるはずです。私の問題は、 ";"同じシェルで複数のコマンドを実行できます。GNU makeと使用;同じコマンドシェルで複数のシェルコマンドを実行する

私が理解しているように、makeはそれぞれのコマンドシェルで各行を実行します。したがって、2つのコマンドを順に実行する場合は、セミコロンで区切った同じ行に置く必要があります。ではその最も単純な形式です:

all: 
    echo hello; echo hello 

...出力を生成する必要があります

hello 
hello 

しかし、私のためにそれは出力を生成します。つまり

hello; echo hello 

、セミコロンがされていますシェルにまっすぐ渡されました。これはcmd.exeにとってあまり意味がありません。

は私が

ちなみに、私はこれを必要とする理由は、私はその必要があります$(foreachの)ループを使用しているということです...今私が間違って行ってきたと指摘誰もが当惑する準備ができています各反復に対して2つのシェルコマンドを実行します。

+0

あなたは['.ONESHELL'](https://www.gnu.org/software/make/manual/make.html#One-Shell)に興味があるかもしれません – user657267

+0

私は私の問題を私はまだ$(foreach)ループでマルチコマンドを構築する必要があり、実際の改行をシェルに渡すことはできません。しかし、私は今悪魔が何であるか理解しています。 – Rob

+0

'$(shell echo hello; echo hello)'を使用します。 – bfieck

答えて

1

;は、複数の コマンドをレシピ内の同じシェルで実行するためのGNU-make演算子であるという印象を受けています。そうではありません。 linuxシェルオペレータ 同じ行に一連のコマンドを区切ります。それは Windowsのシェル、cmdための演算子ではないので、レシピとき:

echo hello; echo hello 

がLinux上でmakeによって実行され、それはあなたが期待する出力を持っていますが、Windowsのそれだけの手段にmake によって実行された場合このエコー:

hello; echo hello 
+0

ああ、ありがとう、それはそれを説明するでしょう。GNU Makeのドキュメンテーションは、シェルがセミコロンを理解できることを明確にはしていませんが、 "シェルはステートメントを順番に実行します"と言います。明らかにこれはWindowsではそうではありません。 Windows上でmakeを実行しているほとんどの人は、それに付随するシェルを得る傾向があることが私に指摘されています。私は物事をシンプルに保ち、makeだけを使いたいと思っていました。回避策は、私の場合、define/endefを使ってコマンドのシーケンスを定義し、それを私のforeach()ループから呼び出すことです。 – Rob

+0

@Rob [5.3 Recipe Execution](https://www.gnu.org/software/make/manual/make.html)を参照しています。シェルは順番にステートメントを実行します。 operative シェルの "statement"の定義。これは、Windowsと同じようにLinux上にも当てはまります。セミコロンは言及されていません。 'cmd'で実行する' cmd'文を書く必要があります。他の文脈でのように 'bash'で実行するために' bash'文 を 'bash'で書く必要があります。 –

+0

申し訳ありませんが、私は間違ったテキストを引用しました。私は[ルールでコマンドを書く](ftp://ftp.gnu.org/old-gnu/Manuals/make-3.79.1/html_chapter/make_5.html)を見ていました。 _Command Execution_の下にあるところ: "cdを使って次のコマンドに影響を与えたい場合は、それらの間に**セミコロン**をつけて1行に2つ入れてから、makeはそれらを1つのコマンドとみなして一緒に渡します、それらを順番に実行するシェルへ " – Rob

0

だから、答えはあなたのシェルが;が同じ行に複数のコマンドを分離していることを理解しなければならないものがあるということです、それはメイクとは何の関係もないのです。これはWindowsの場合はcmd.exeではありませんが、通常はmake(Linux、msysなど)を使用する環境で通常到着するシェルの場合です。私の場合には、優れた回避策は、このでした:「シングル並ぶ」定義のこのフォームで

define useDef 
    echo hello 
    echo hello 
endef 

all: 
    $(call useDef) 

私は$(foreachの)内部で複数行のシェルコマンドを呼び出すことができます。 makeはそれ自身のシェルでそれぞれ "hello"を実行しますが、出力をファイルに追加しているので問題ありません。なんらかの理由で同じシェルで2つのコマンドを実行する必要がある場合、Windowsでは、別個のバッチファイルを作成する必要があります(makefile内から作成することができます)。

+0

あるいは、@ user657267のように、シェルコマンドを1つのシェルで順番に実行する必要がある場合、 '.ONESHELL'があなたの答えかもしれませんが、乱雑なバッチファイルは必要ありません。 – Rob

関連する問題