쉘에서 && 와 ; 의 차이점

shamlock의 이미지

아래의 두 명령의 차이점이 무엇인가요?

a.out && b.out && c.out

a.out ; b.out ; c.out

irondog의 이미지

&& 는 앞서 한 동작이 정상 종료 되었을 때 다음 명령이 수행될 수 있도록
하는 연산자가 아닌가요? 그렇담 ;는 무관하게 순차적인 작업을 수행 시킬 때
쓰겠죠. 아니면 말고~~ :twisted:

jhumwhale의 이미지

irondog wrote:
&& 는 앞서 한 동작이 정상 종료 되었을 때 다음 명령이 수행될 수 있도록
하는 연산자가 아닌가요? 그렇담 ;는 무관하게 순차적인 작업을 수행 시킬 때
쓰겠죠. 아니면 말고~~ :twisted:

저도 그렇게 알고 있습니다..
a.out && b.out && c.out

최종적으로 c.out이 a.out이나 b.out의 최종적 결과물을 쓰기 위해 정상 종료를 선결조건이라서 괜히 a.out이나 b.out이 비정상종료되서 c.out에 실행조건에 맞지 않아 복잡하게 만들 필요는 없겠죠.

ps. 하지만 궁금한 것이
분명 운영체제 상 응용프로그램수행결과의 정상 반환값이 0 이고
비정상은 0이 아닌 값인데
&&는 그게 아닌가 보더라고요..
그래서 가끔 헷갈렸었습니다... :twisted:

raymundo의 이미지

jhumwhale wrote:

ps. 하지만 궁금한 것이
분명 운영체제 상 응용프로그램수행결과의 정상 반환값이 0 이고
비정상은 0이 아닌 값인데
&&는 그게 아닌가 보더라고요..
그래서 가끔 헷갈렸었습니다... :twisted:

좀 더 자세한 설명 부탁드려도 될까요?

좋은 하루 되세요!

cinsk의 이미지

자주 혼동하는 부분입니다.

C 언어나 기타 대부분의 언어에서 0은 거짓으로, 그 외의 값은 참으로 인식됩니다.

Unix 호환 시스템에서, command는 실행이 끝난 후 exit status를 남기는 데, 이는 일반적으로 0이 성공적인 수행을, 0이 아닌 값 (대개 양수)은 수행 실패를 의미합니다.

shell operator인 && (AND)는 의미상 "앞 명령의 수행이 성공적으로 끝나면 뒤 명령을 실행한다"입니다. 이는 C 언어나 기타 언어에서 AND 연산자, 즉 "앞 expression이 참일 경우, 뒤 expression의 값을 조사한다"와 일치합니다.

다만 0이란 값이 참(성공)을 의미하는 가, 거짓(실패)을 의미하는 가에 대한 차이입니다.

cinsk의 이미지

한 가지 더, A and B와 A or B의 의미는 원래, "둘 다 참인가?" 와 "둘 중 하나가 참인가?"로 해석하는 것이 일반적입니다. 하지만, A and B에서, A가 거짓이면, B는 조사할 필요가 없어집니다. 마찬가지로 A or B에서, A가 참이면 B는 조사할 필요가 없어집니다. 이것을 short circuit이라 하여, C와 같은 언어에서는 뒤의 값을 조사하지 않는다는 것이 원칙입니다. 따라서 다음과 같은 코드가 가능해 집니다:

char *p;
...
if (p != NULL && *p == '3') {
  ...
}

즉, p가 NULL이 아닐 경우, 뒤의 "*p == '3'"은 아예 수행되지 않기 때문에, 위와 같이 쓸 수 있습니다. 물론 풀어서 다음과 같이 쓸 수도 있습니다:

char *p;
...
if (p != NULL)
  if (*p == '3') {
    ...
  }

또한 LISP과 같은 언어에서는 간단한 조건 판단식일 경우, IF를 쓰는 것보다 AND, OR를 관습적으로 즐겨 사용합니다. 즉,

(and (null p)
     (setq p some-value))

는 p가 null일 경우, p에 some-value를 대입하는 코드입니다. 또한

(or (null p)
    (setq p nil))

는, p가 null이 아닐 경우, p에 nil을 대입하는 코드입니다.

그럼 이만.

shamlock의 이미지

얘기가 나온김에 좀더 세밀한 질문을..
만약 내가 쉘을 만든다면..
a.out && b.out && c.out 명령이 입력되었을때

쉘과 Command의 부모자식관계가 두가지 경우가 있을수 있겠는데요

경우1번

쉘은 부모 프로세스
  a.out은 쉘의 자식
  b.out은 쉘의 자식
  c.out은 쉘의 자식

경우2번

쉘은 부모 프로세스
  a.out은 쉘의 자식
  b.out은 a.out의 자식
  c.out은 b.out의 자식

( 제 생각으로는 1번이 맞을거 같은데요 .. 자신없음 `_ _`)

스티븐스아저씨 책에서 본거 같은데 하도 오래되서 기억이 안나네요
나중에 다시한번 봐야겠습니다.

a.out ; b.out ; c.out 명령이 입력되었을때도 경우1번인가요?

--------------------------------
수정.........

자신없는 자답입니다만..
흑 생각해보니 경우2번은 나올수가 없겠네요
지송..

@.@

cinsk의 이미지

파이프가 아닌 경우, shell에서 ';'이든, '&&'이든, '||'이든, 앞 명령이 끝난 후, 뒤 명령을 실행할 것인지 아닌지 판단합니다. (';'경우, 무조건 수행) 따라서, "경우 1"처럼 하는 것이 일반적입니다. 2처럼 하려면 sync 맞추기가 귀찮아 집니다.

raymundo의 이미지

cinsk님의 말씀 감사합니다. 제가 알고 있기로도 말씀하신 그대로인데, 위에 jhumwhale님께 보충 설명을 부탁드린 이유는,

jhumwhale wrote:

ps. 하지만 궁금한 것이
분명 운영체제 상 응용프로그램수행결과의 정상 반환값이 0 이고
비정상은 0이 아닌 값인데
&&는 그게 아닌가 보더라고요..
그래서 가끔 헷갈렸었습니다... :twisted:

"&&는 그게 아닌가 보더라고요"가 무슨 뜻으로 하신 말씀인지 이해가 되지 않아서였습니다. "정상 반환값이 0이고 비정상은 0이 아닌 값"인 것이 맞는데, &&는 뭐가 아니라는 것인지...

굳이 참-거짓 쌍을 0-0아닌수 쌍과 매치시켜서,
c 에서는 0 && f 이면 f가 실행되지 않지만
쉘에서는 0 && f 이면 f가 실행된다...는 뜻으로 하신 말씀이신지,
(그렇다면 결국 cinsk님의 말씀처럼 &&의 문제가 아니라 0의 의미가 뭐냐의 차이일 뿐인거죠)
아니면 다른 차이가 더 있는걸 제가 모르고 있는건가 싶어서요. :-)

좋은 하루 되세요!

jhumwhale의 이미지

raymundo wrote:

"&&는 그게 아닌가 보더라고요"가 무슨 뜻으로 하신 말씀인지 이해가 되지 않아서였습니다. "정상 반환값이 0이고 비정상은 0이 아닌 값"인 것이 맞는데, &&는 뭐가 아니라는 것인지...

굳이 참-거짓 쌍을 0-0아닌수 쌍과 매치시켜서,
c 에서는 0 && f 이면 f가 실행되지 않지만
쉘에서는 0 && f 이면 f가 실행된다...는 뜻으로 하신 말씀이신지,
(그렇다면 결국 cinsk님의 말씀처럼 &&의 문제가 아니라 0의 의미가 뭐냐의 차이일 뿐인거죠)
아니면 다른 차이가 더 있는걸 제가 모르고 있는건가 싶어서요. :-)


:) cinsk말씀 하신 의미로 썼을 뿐입니다..
제 표현이 부족했었군요...
불필요한 오해를 일으켜서 죄송합니다.
raymundo의 이미지

jhumwhale wrote:
raymundo wrote:

"&&는 그게 아닌가 보더라고요"가 무슨 뜻으로 하신 말씀인지 이해가 되지 않아서였습니다. "정상 반환값이 0이고 비정상은 0이 아닌 값"인 것이 맞는데, &&는 뭐가 아니라는 것인지...

굳이 참-거짓 쌍을 0-0아닌수 쌍과 매치시켜서,
c 에서는 0 && f 이면 f가 실행되지 않지만
쉘에서는 0 && f 이면 f가 실행된다...는 뜻으로 하신 말씀이신지,
(그렇다면 결국 cinsk님의 말씀처럼 &&의 문제가 아니라 0의 의미가 뭐냐의 차이일 뿐인거죠)
아니면 다른 차이가 더 있는걸 제가 모르고 있는건가 싶어서요. :-)


:) cinsk말씀 하신 의미로 썼을 뿐입니다..
제 표현이 부족했었군요...
불필요한 오해를 일으켜서 죄송합니다.

허억, 죄송하다고 말씀하시면 제가 더 죄송합니다. 제가 처음에 제대로 이해하고 넘어갔으면 될 것이었는데요 ^^;; 답글 주셔서 감사합니다~

좋은 하루 되세요!

goodfiend의 이미지

IF X THEN
  a;
ELSE
  b;

이런 표현식이 bash에서는 다음처럼 가능합니다..

X && 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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.