exit $$0 의 의미가 무엇인가요?(Makefile에서 shall script)
글쓴이: kjw7945 / 작성시간: 일, 2005/07/24 - 7:15오후
다음과 같은 파일 내용이 있습니다.
파일은 Makefile입니다..
DIR = memo calendar main OBJECTS = memo.o calendar.o main.o TARGETS = diary CFLAGS = -W -Wall -O2 -g all : objs $(CC) $(CFLAGS) -o $(TARGETS) $(OBJECTS) objs : @for dir in $(DIR); do make -C $$dir || exit $$?; done clean : @for dir in $(DIR); do \ make -C $$dir clean; \ done rm -rf $(OBJECTS) $(TARGETS)
exit $$?가 없으면 작동이 안되는데요...
exit $$?의 의미가 무엇인지 잘 모르겠습니다...
어째서 exit가 없으면 작동이 안되는지요...
또 이상한건 exit $? 라고 작동이 됩니다...
$$?와 $?의 차이는 없는지요..? (쉘스크립트이기 때문에
두개 붙여야 되는걸로 알고 있습니다만..)
$$?의 의미는 쉘에게 프로그램이 반환하는 값으로 알고
있는데 달라를 하나만 써도 되고..
그것을 왜 exit하는지 그 의미가 무엇인지.....
잘 모르겠습니다..ㅠㅠ
Forums:
Makefile은 해석기가 make입니다.make 문법에서 $(이
Makefile은 해석기가 make입니다.
make 문법에서 $(이름) 은 매크로를 치환하는 기능을 가지고있습니다. 그리고 $$ 는 $ 자체를 뜻합니다.
@for dir in $(DIR); do make -C $$dir || exit $$?; done
의 코드를 make가 먼저 해석하면
@for dir in memo calendar main; do make -C $dir || exit $?; done
이 되고.. 이제 이것을 쉘이 해석을 할것입니다.
보기 쉽게 정리하면..
루프를 돌면서.. make -C $dir을 수행하고 참이 아니면 exit $? 를 수행하게 됩니다.
여기서의 $? 는 말씀하신것 처럼 '프로그램이 반환하는 값' 이 맞습니다. 일반적으로 0 이면 잘 수행 된 것입니다.
makc -C $dir 이 실패하면서 나온 반환값을 반환값으로 하면서 종료를 하는것 입니다.
그리고 한가지 참조하실것은 make에서의 $? 과 쉘스크립트에서의 $?는 의미가 다릅니다.
make에서 $?는 현재의 타겟 보다 최근에 갱신된 파일명을 뜻합니다.
여기서는 $$? 로 사용해서.. 쉘스크립트에서의 $? 로 사용되었습니다.
그럼.. 도움이 되었기를...
-----
늘 여유가 함께하길..
꼭 반환해야 하는 이유가 있나요?
우선 답변 감사드립니다. 그런데 한가지 궁금한 점이 있는데요.
make -C $dir 이 실패하면서 나온 반환값을 반환값으로 하면서 종료를 하는것 입니다
꼭 반환값을 반환값으로 하면서 종료할 이유가 있나요make clean부분을 보면 그곳에는 exit를 쓰지 않았는데도
잘 작동이 되는 반면에
objs 부분에는 exit를 써야만 Makefile이 잘 작동이 되거든요..
따라서 왜 꼭 써야 하는지가 잘 모르겠네요.....
그리고..
그리고... || 부분은 참이 아니면 exit가 실행된다고 하셨는데
제가보기에는 or 같은데요.. not아니라요..
그런데 이부분이
이상하거든요.. 제가 || 의 기호의 의미를
잘못 해석하고 있는건가요?
Re: 꼭 반환해야 하는 이유가 있나요?
중간에 컴파일 에러가 난다든지 하는 이유로 make가 실패하면 다른 디렉토리로
옮겨가서 더 진행해봤자 의미가 없으니까 exit 하는 거죠. clean의 경우는
obj나 실행 파일을 지우는 거니까 상관없고요.
Re: 그리고..
잘못 해석한 것은 아닙니다만 완전히 해석한 것도 아닙니다.
&&(and)나 ||(or)의 short circuit 메커니즘을 이용한 것이죠.
A || B 는 if (!A) B
A && B 는 if (A) B
와 같은 뜻입니다.
답변 감사합니다.
답변 정말 감사드립니다.
이제 감이 오네요..
이제 제게 남은건 short circuit mechanism을
공부하는 것이군요..감사합니다.
short circuit 메커니즘:* A || B 일때, A가 참이면
short circuit 메커니즘:
* A || B 일때, A가 참이면 B는 evaluation할 필요가 없다.
* A && B 일때, A가 거짓이면 B는 evaluation할 필요가 없다.
따라서, short circuit 메커니즘을 적용하면
* A || B는 "if (!A) B;"
* A && B는 "if (A) B;"
와 같은 의미를 갖는다.
댓글 달기