2011-04-14 7 views
2

나는 메이크 파일을 생성하고 Mac OS X에서 완벽하게 작동하는 시스템을 가지고 있습니다. 리눅스에서 실행하면 이상한 문제가 발생합니다. 나는 매우 간단한 예제로 내 메이크 파일을 줄일 수 있었다 :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 

사용 권한이 올바르게 변경됩니다. 유일한 차이점은 both1에 대해 제거한 양쪽 모두에서 리디렉션 "&> compile__"입니다.

아이디어가 있으십니까?

+0

우분투 리눅스에서 gnumake 버전 3.81을 실행한다는 사실을 잊어 버렸습니다. – Tsf

+0

저에게 맞는 작품 : CentOS 5.4 (Final); GNU Make 3.81; gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46); hello.c; –

+0

다른 Linux에서 Fedora 9 (Sulfur)와 같은 GNU Make 3.81을 테스트했습니다. 문제 없어! 내 설치 아래서 만 나타나는 것 같습니다 : Ubuntu 10.04.2 LTS, 커널 2.6.32-30. – Tsf

답변

4
&> compile__ 

하지 휴대용 재 이다. bash에서는 표준 오류와 표준 출력 모두를 리디렉션합니다. 이는 사용자의 의도라고 가정합니다. 다른 쉘은 다른 것들을 할 가능성이 있습니다. 특히 대시는 명령 (&)을 배경으로하고 표준 출력 (> compile__)을 리디렉션합니다. chmod은 컴파일이 완료되기 전에 실행되고 prog을 만듭니다. cc -o prog *.c > compile__ 2>&1을 사용하면 표준 오류와 표준 출력을 모두 리디렉션 할 수 있습니다.

(왜 맥? 다른 &> 해석 아마도 다른 쉘, 이전 파일을 여는 컴파일러는, 아마도 경쟁 조건이 약간 다르게 나오는 가능한 작업 않았다.)

+1

bash에서,''&>' '는 stdout과 stderr를 같은 파일로 재 지정합니다; 그것은 backgrounding 효과가 없습니다. 나는 시험 –

+0

세 가지 시스템 (맥 OS, 페도라와 우분투) 같은 GNU 배쉬를 사용하므로 다르게 작동해서는 안된다. – Tsf

+3

Make는 bash가 아닌 시스템의/bin/sh를 사용합니다. 우분투 시스템은 일반적으로/bin/sh에 대시 (dash)를 사용합니다. 대시 참으로 배경을 수행하고,이 "compile__"@Tsf을 리디렉션 빈 명령을 실행 : 유머 나하고 '> compile__ 2> & 1'표준 방법이 리디렉션을 수행하는 전환 해보십시오. – wnoise

0

대체 솔루션을 지정하는 것입니다 GNU make을 사용하십시오. 설명서의 Section 5.3.1에 관한 정보가 있습니다. 예를 들어,은 A 메이크에서

export SHELL=`which bash` 

을 다음은 GNU 쉘과 같은 bash는을 선택 우분투/데비안 3.8.1을 확인받을 것으로 보인다.

다른 문제는 데비안 기반 시스템에서 make에서 실행할 때 이러한 내장의에 밀교 옵션 신비 실패 할 수 있습니다 등 echo, printf, test처럼, 모든 쉘 내장의의 동작의 차이입니다 .