2011-04-14 122 views
2

我有一個系統,我生成一個生成文件,並在Mac OS X下完美工作。當我在Linux下運行它時,出現一個奇怪的問題。我設法減少我的生成文件到一個非常簡單的例子:gnumake奇怪的重定向問題

 
    compile: 
     gcc -o prog *.c &> compile__ 

    chm: 
     chmod u=rwx,g=rwx,o= prog 

    both0: 
     gcc -o prog *.c &> compile__ ; \ 
     chmod u=rwx,g=rwx,o= prog 

    both1: 
     gcc -o prog *.c ; \ 
     chmod u=rwx,g=rwx,o= prog 

這個想法是編譯一個文件,然後更改其權限。如果我執行命令序列:

 
    make compile 
    make chm 

一切工作正常。但是,如果我執行:

 
    make both0 

我得到的消息:

 
    chmod: cannot access `prog': No such file or directory 

和權限不會改變。另一方面,如果我執行:

 
    make both1 

權限已正確更改。唯一的區別是在兩個我都刪除了兩個1下的重定向「&> compile__」。

任何想法?

+0

我忘了提及我在Ubuntu Linux下運行gnumake 3.81版。 – Tsf 2011-04-14 14:47:00

+0

適用於我:CentOS版本5.4(最終版); GNU Make 3.81; gcc(GCC)4.1.2 20080704(Red Hat 4.1.2-46);你好ç; – 2011-04-14 15:03:46

+0

我在另一個Linux上測試了它:Fedora release 9(Sulfur)和相同的GNU Make 3.81。沒問題!它似乎只發生在我的安裝下:Ubuntu 10.04.2 LTS,內核2.6.32-30。 – Tsf 2011-04-14 16:48:03

回答

4
&> compile__ 

便攜式重定向。在bash中,它重定向了標準錯誤和標準輸出,我認爲這是你的意圖。其他炮彈可能會對它做不同的事情。特別是,破折號背景命令(&),並重定向標準輸出(> compile__)。在編譯完成之前執行chmod並創建prog。重定向標準錯誤和標準輸出可以用cc -o prog *.c > compile__ 2>&1便攜式完成。

(爲什麼它的Mac嗎?可能是不同的外殼,解釋&>不同,可能編譯器打開文件前,可能是一個競爭條件出來稍有不同的方式工作。)

+1

在bash中,'&&'''將stdout和stderr重定向到同一個文件;它沒有背景效果。 – 2011-04-15 00:50:49

+0

我測試的三個系統(Mac OS,Fedora和Ubuntu)使用相同的GNU Bash,因此它們不應該有不同的表現。 – Tsf 2011-04-15 01:12:36

+3

Make使用系統的/ bin/sh,它可能不是bash。 Ubuntu系統通常使用「dash」作爲/ bin/sh。 Dash確實是背景,並運行一個空的命令重定向到「compile__」@Tsf:幽默我,並嘗試將它切換到'> compile__ 2>&1',這是執行此重定向的標準方法。 – wnoise 2011-04-15 01:44:24

0

另一種解決方法是指定對於GNU make使用shell。本手冊的Section 5.3.1有關於此的信息。例如,下面的

export SHELL=`which bash` 

Makefile中似乎得到了GNU make 3.8.1在Ubuntu/Debian的選擇慶典作爲外殼。

的其他問題是在所有的殼內置的的行爲差異,比如echoprintftest,等當上基於Debian的系統make下運行密宗選項,這些內置的可神祕的失敗。