makefile의 파일 함수는 ‘@’기호로 시작하는 인수를 취합니다. 왜 rm 같은 셀 명령에 @ 기호를 붙이는지요?

이 코드는 GNU makefile 매뉴얼의 8.6 장에서 발췌 한 것입니다.

makefile에서 파일 함수 arg에 대한 @ $ @. in은 무엇을 의미합니까? 왜 rm과 같은 셸 명령에 ‘@’기호가 붙는가?

program: $(OBJECTS)
     $(file >$@.in,$^)
     $(CMD) $(CMDFLAGS) @$@.in
     @rm $@.in

파일 함수 구문은

$(file op filename[,text])


답변

여기에는 관련이 없는 세 가지 용도가 @있습니다.

에서는 $@, 캐릭터 @의 이름을 자동 가변 규칙에 사용될 수있다. 해당 변수의 값은 규칙이 작성하는 대상입니다.

@탭 문자 바로 뒤에 레시피 (명령) 줄의 맨 처음에 사용될 때 명령 을 실행하려고 할 때 명령 이 인쇄되지 않습니다 .

@다른 곳 의 캐릭터 는 특별하지 않습니다.

따라서 귀하의 예에서 다음을 작성하십시오 program.

  1. file기능이 호출됩니다. 대상 ( $^자동 변수) 의 종속성을 파일에 씁니다 program.in.
  2. 변수에 저장된 명령은 CMD변수에 저장된 매개 변수 CMDFLAGS와 추가 매개 변수를 사용하여 실행 됩니다 @program.in. 이것이하는 것은 무엇에 달려 있습니다 CMD.
  3. 명령 rm program.in은 먼저 인쇄하지 않고 실행됩니다.

일부 명령은 시작 @매개 변수를 더 많은 매개 변수를 읽을 파일을 나타내는 것으로 간주합니다 . 이것은 DOS가 명령 행 길이를 엄격하게 제한하고 명령의 출력을 명령 행에 보간 할 방법이 없기 때문에 발생하는 DOS 규칙입니다. 유닉스에는 이러한 제한이 없기 때문에 유닉스 세계에서는 드문 일입니다. 레시피의 효과는 다음과 같습니다.

$(CMD) $(CMDFLAGS) $(OBJECTS)

답변

줄의 @ 접두사 는 줄의 에코 를 억제 합니다.

기본적으로 실행되기 전에 make각 줄을 인쇄합니다 Makefile. 행이로 시작하면 @해당 행이 인쇄되지 않습니다.

없이 @:

$ cat > Makefile
hello:
    echo hello world
$ make hello
echo hello world
hello world

@:

$ cat > Makefile
hello:
    @echo hello world
$ make hello
hello world

@라인 시작시 에만 에코가 억제 됩니다. >$@.in또는 @$@.in그냥 일반 문자열이며 $@확장됩니다.

$ cat hello
hello:
    @echo @$@.in
$make hello
@hello.in