리눅스 수업

연속적으로 명령 실행시키기 (;과 &와 &&의 차이)

CLI의 가치

명령을 통해서 컴퓨터를 제어하는 중요한 이유 중의 하나는 해야 할 일을 순서대로 배치해서 자동화된 처리를 할 수 있다는 점입니다. 정확한 작업을 위해서는 명령어와 명령어를 연결하는 구분자를 잘 이해하셔야 합니다. 언어로치면 접속사와 같은 역할을 하는 것입니다. 여기서는 이 접속사들을 정리해봅니다. 

 

 

결론

  • ; - 앞의 명령어가 실패해도 다음 명령어가 실행
  • && - 앞의 명령어가 성공했을 때 다음 명령어가 실행
  • & - 앞의 명령어를 백그라운드로 돌리고 동시에 뒤의 명령어를 실행

; - 성공여부와 상관없이 다음 명령어 실행

한 줄에 여러 명령어를 순서대로 배열할 때는 ;를 구분자로 사용합니다. 아래 명령어는 test를 만든 후에 test 디렉토리로 이동합니다. 

mkdir test;cd test

&& - 성공한 경우에 다음 명령어 실행

&&의 의미

&&는 앞의 명령어가 실행되었을 때 성공한 경우에 다음 명령어를 실행합니다. ;와는 다릅니다. 예를들어보죠. 아래와 같은 명령어가 있을 때

mkdir test; cd test; touch abc

test 디렉토리가 이미 있어서 아래와 같은 상황이라고 해보죠. 

mkdir test(실패); cd test; touch abc

이 경우 cd test가 실행되고, touch abc도 실행됩니다. 

 

반면에 아래의 경우는 cd test와 touch abc가 실행되지 않습니다. 

mkdir test(실패) && cd test && touch abc

성공&실패와 무관하게 연속적으로 실행해야 할 명령이 있을 때 ;를 씁니다. 이전 명령이 성공했을 때 다음 명령을 실행하려면 &&를 씁니다. 대체로 &&를 쓰는게 좋을 때가 많습니다. 좀 더 정확하게는 &&는 이전 명령어의 실행결과가 참(true)일 때만 다음 명령을 실행합니다. 아래 내용은 참고삼아 읽어보세요. 

명령어의 반환값

리눅스(유닉스)의 모든 명령어는 종료할 때 성공 여부를 알려줍니다. 예를들어보죠. 

test 디렉토리가 없는 곳에서 아래 명령을 실행해보세요. 성공했을 때 어떻게 되는지 보시죠. 

mkdir test

그리고 아래 명령을 실행해보세요. 

echo $?

이 명령어는 이전 명령어가 반환한 값을 알아내는 것입니다. 결과는 아래와 같습니다. 

0

반대로 test 디렉토리가 이미 있는데 mkdir test를 실행한 후에 echo $?를 실행하면 아래 값이 출력됩니다. 

1

또는 존재하지 않는 명령어를 실행하면 127이 출력될꺼예요. 즉 리눅스에서는 0이 아닌 값은 실패(false)를 의미합니다. 

 

 

 

 

&와 &&는 다릅니다. 

&는 명령어를 백그라운드로 동작시킬 때 사용합니다. 

mkdir test & cd test를 실행하면 아래와 같은 결과가 나옵니다. 

[1] 19989
cd: no such file or directory: test
[1]  + 19989 done       mkdir test

test 디렉토리를 백그라운드로 생성함과 동시에 test 디렉토리로 이동하려고 했기 때문에 cd test는 존재하지 않는 디렉토리로 진입하려고 시도하기 때문입니다. 한편, test 디렉토리는 생성됩니다. 

명령의 그룹핑 {}

명령을 그룹핑 할 수도 있습니다. 아래 명령은

mkdir test3 && { cd test3; touch abc; echo 'success!!' } || echo 'There is no dir';
  • mkdir test가
  • 성공했을 때 cd test2; touch abc를 실행하고 success!!를 출력합니다. 
  • 실패했을 때 echo 'There is no dir'를 실행합니다. 
  • 이때 실행되는 명령들은 현재 쉘의 컨텍스트에서 실행됩니다. 만약 서브 컨텍스트에서 실행하고 싶다면 '('와 ')'를 사용하시면 됩니다. (참고)

 

댓글

댓글 본문
작성자
비밀번호
  1. 쿠반
    서브쉘의 의미를 잘모르겠어서 검색해봤어요
    http://m-youngzzang-for20.tistory.com/158
    이해하는데 조금은 도움이 되었습니다 다른분들도 참고하세요
  2. 리브
    mkdir test가 -> mkdir test3가
    성공했을 때 cd test2; -> 성공했을 때 cd test3;

    오타인것 같네융! 좋은 강의 감사히 잘 봤습니다
  3. 최동희
    참고 링크 보니 BASH 정리된 문서가 있군요!!
    종종 이 문서도 찾아봐야겠네요.
    http://www.gnu.org......tml
  4. egoing
    저도 몰랐던 거네요! 서브쉘이 있었군요. ^^
    대화보기
    • egoing
      앗 제가 중요한 내용을 빼먹었네요. ^^ 추가했어요~
    • Kwon Young Kim
      http://www.gnu.org......tml

      그룹핑에 2가지가 있군요. 덕분에 좋은정보 알아갑니다. 감사합니다.
      대화보기
      • Paul Jang
        cd test2 && touch abc 가 더 좋겠네요.
        대화보기
        • Paul Jang
          {} 그룹핑을 쓰면

          mkdir test2 && { cd test2; touch abc; } || echo 'There is no dir';

          이 되고, 문제에 충실해서 mkdir test 는 성공했지만 cd test2 나 touch abc 가 실패했을때를 고려하면

          mkdir test2 && { { cd test2;touch abc; } || true } || 'There is no dir';
          이나
          mkdir test2 && { cd test2;touch abc; true; } || echo 'There is no dir'
          로 하면 될 것 같아요 :-)
          대화보기
          • Kwon Young Kim
            문제를 내신걸로 이해하고 풀어보면 아래와 같은 코드가 오겠군요.

            mkdir test2 && (cd test2; touch abc) || echo 'There is no dir';
            대화보기
            • 리눅리눅
              명령의 그룹핑 {}
              섹션에 코드가 없는것 같아요ㅠㅠ
              확인한번 부탁드립니닿
              좋은 자료 감사합니다!
            버전 관리
            egoing
            현재 버전
            선택 버전
            graphittie 자세히 보기