bash – 如何在Ubuntu下處理GNU Make中的shell擴充套件?
給定這個非常簡單的Makefile:
all: @mkdir -pv test/{a,b}
我在OS X 10.6.8和CentOS 5.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}'
在所有平臺的shell中手動執行命令mkdir -pv test / {a,b}可以獲得預期的結果.
所有平臺上的GNU Make版本相同:
GNU Make 3.81 Copyright (C) 2006Free 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下有什麼不同,為什麼shell擴充套件在那裡工作?
問題可能是Make spawns / bin / sh.它通常是系統預設shell的符號連結.
選項1
你可以確定它指向bash(因為這是一個bashism).可能現在是/ bin / dash或/ bin / sh,具體取決於您的Ubuntu版本.
選項2
更容易選擇:
SHELL=/bin/bash all: @echo a{3,4} @bash -c 'echo a{3,4}'
除非您註釋掉SHELL =行,否則列印兩次相同的輸出
選項3
如果你不能/不想修改make檔案,你可以這樣呼叫它:
make SHELL=/bin/bash
注意與子生成檔案或包含的互動.您可能需要檢視make -e選項和make export關鍵字:ofollow,noindex" target="_blank">http://www.gnu.org/s/hello/manual/make/Variables_002fRecursion.html
http://stackoverflow.com/questions/6681624/how-to-handle-shell-expansions-in-gnu-make-under-ubuntu