exit $$0 의 의미가 무엇인가요?(Makefile에서 shall script)

kjw7945의 이미지

다음과 같은 파일 내용이 있습니다.
파일은 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하는지 그 의미가 무엇인지.....
잘 모르겠습니다..ㅠㅠ

kerz의 이미지

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

이 되고.. 이제 이것을 쉘이 해석을 할것입니다.

보기 쉽게 정리하면..

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아니라요..

그런데 이부분이

이상하거든요.. 제가 || 의 기호의 의미를

잘못 해석하고 있는건가요?

doldori의 이미지

글쓴이 wrote:
make clean부분을 보면 그곳에는 exit를 쓰지 않았는데도
잘 작동이 되는 반면에

objs 부분에는 exit를 써야만 Makefile이 잘 작동이 되거든요..

따라서 왜 꼭 써야 하는지가 잘 모르겠네요.....


중간에 컴파일 에러가 난다든지 하는 이유로 make가 실패하면 다른 디렉토리로
옮겨가서 더 진행해봤자 의미가 없으니까 exit 하는 거죠. clean의 경우는
obj나 실행 파일을 지우는 거니까 상관없고요.
doldori의 이미지

글쓴이 wrote:
그리고... || 부분은 참이 아니면 exit가 실행된다고 하셨는데

제가보기에는 or 같은데요.. not아니라요..

그런데 이부분이

이상하거든요.. 제가 || 의 기호의 의미를

잘못 해석하고 있는건가요?


잘못 해석한 것은 아닙니다만 완전히 해석한 것도 아닙니다.
&&(and)나 ||(or)의 short circuit 메커니즘을 이용한 것이죠.
A || B 는 if (!A) B
A && B 는 if (A) B
와 같은 뜻입니다.
익명 사용자의 이미지

답변 정말 감사드립니다.

이제 감이 오네요..

이제 제게 남은건 short circuit mechanism을

공부하는 것이군요..감사합니다.

jeweljar의 이미지

short circuit 메커니즘:
* A || B 일때, A가 참이면 B는 evaluation할 필요가 없다.
* A && B 일때, A가 거짓이면 B는 evaluation할 필요가 없다.

따라서, short circuit 메커니즘을 적용하면
* A || B는 "if (!A) B;"
* A && B는 "if (A) B;"
와 같은 의미를 갖는다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.