20

これは非常に単純Makefileです:

all:
    @mkdir -pv test/{a,b}

OSX10.6.8およびCentOS5.5で次の出力が得られます。

mkdir: created directory `test'
mkdir: created directory `test/a'
mkdir: created directory `test/b'

しかし、Ubuntu 11.04では、次のようになります。

mkdir: created directory `test'
mkdir: created directory `test/{a,b}'

mkdir -pv test/{a,b}すべてのプラットフォームのシェルでコマンドを手動で実行すると、期待どおりの結果が得られます。

GNU Makeのバージョンは、すべてのプラットフォームで同じです。

GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program is built for [PLATFORM]

Ubuntuでは何が違うのですか?なぜシェル拡張がそこで機能しないのですか?

4

2 に答える 2

36

問題はおそらく Make spawn/bin/shです。これは通常、システムのデフォルト シェルへのシンボリック リンクです。

オプション1

それが bash を指していることを確認できます (これはバシズムであるため)。おそらく、Ubuntu のバージョンに応じて、現在は /bin/dash または /bin/sh になっています。

オプション 2

より簡単なオプション:

SHELL=/bin/bash

all:
    @echo a{3,4}
    @bash -c 'echo a{3,4}'

SHELL=行をコメントアウトしない限り、これは同じ出力を2回出力します

オプション 3

make ファイルを変更できない/変更したくない場合は、次のように呼び出すことができます。

make SHELL=/bin/bash

サブメイクファイルまたはインクルードとの相互作用に注意してください。make -eオプションと makeexportキーワードを参照してください: http://www.gnu.org/s/hello/manual/make/Variables_002fRecursion.html

于 2011-07-13T15:47:51.827 に答える
1

Makeを使うのは久しぶりです...

使用する特定のシェルを指定するには、いくつかの方法があります。古い Make のデフォルトのシェルはオリジナルの Bourne シェルでした。別のシェルが必要な場合は、自分で設定する必要がありました。

Linux と GNU を使用しているため、デフォルトのシェルとして BASH を使用していると仮定します。Make で次のコマンドを試してください。

echo "random = $RANDOM"

これが単純に表示random =され、乱数が含まれていない場合、Make は BASH ではなくデフォルトのシェルとして Bourne シェルを使用しています。(Linux に本物の Bourne シェルがあるとは思わなかったので、これは奇妙です...) これを回避するには:

  • SHELLBASH シェルを指すマクロを追加できます。
  • コマンドにシェルを含めることができます。

それ以外の:

@mkdir -pv test/{a,b}

これを入れてください:

/bin/bash -c @mkdir -pv test/{a,b}

これは、標準の /bin/sh Bourne シェルではなく、BASH を使用することを指定します。

echo random = $RANDOMが乱数を出力する場合は、BASH (または少なくとも Kornshell) を使用していますが、BRACE EXPANSION が設定されていない可能性があります。Makefile でこれを使用してみてください。

set -o

そして、braceexpandオンになっていることを確認してください。Makeを実行するとオフになる可能性があります。

于 2011-07-13T16:01:04.017 に答える