리눅스 수업

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

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. 열정jk
    220424 감사합니다
  2. labis98
    정말 감사합니다. 항상 많은 도움을 받고 있습니다. 감사합니다~~~!!!
  3. 정말 감사합니다. 이고잉님 덕분에 정말 많은 것들을 배우고 있습니다. 이고잉님의 선한 영향력이 분명히 우리 사회를 좀 더 나은 사회로 만들고 있다고 생각합니다. 저도 이고잉님과 같이 선한 영향력으로 우리 사회에 기여할 수 있는 사람이 되고 싶네요. 정말 감사합니다. 항상 건강하시고 행복하세요~!!!
  4. 홍주호
    20.5.29 완료
  5. ninano
    훌륭한 강의 정말 잘 들었습니다.
    필요한 때가 생기면 다시 돌아와서 수강하겠습니다. 감사합니다!
  6. sinsisao
    mkdir 폴더명; cd 폴더명

    위처럼 쓰면 한번에 쓸 수 있어서 좋군요.

    그런데 폴더명을 두번써야되고 아직 안만들어져서 탭도 안먹는데

    폴더명을 한번만 쓸 수 있는 방법이 있나요?
  7. ChiftKey
    감사합니다.

    ;와 &&의 차이를 알고싶었는데

    명쾌하게 이해되네요!
  8. choon
    감사합니다.
  9. 강철무지개
    수고 많으셨습니다!

    다음 강의도 기대가 됩니다~!
  10. Kyutae Lee
    mkdir test3 && { cd test3; touch abc; echo 'success!!' } || echo 'There is no dir';

    위 명령어에서 echo 'success!!' 뒤에 ; 가 빠진 것 같습니다.

    그러니까
    mkdir test3 && { cd test3; touch abc; echo 'success!!'; } || echo 'There is no dir';
    이 명령어로 해야 제대로 실행되더군요.
  11. 작은섬
    2번 보았더니, 더욱 이해가 되는군요. 동영상 강의 목소리가 너무 좋았습니다. 목소리보다 강의 질이 좋아 나름 열심히 들었습니다. 좋은 내용에 대해 감사드립니다.
  12. 쿠반
    서브쉘의 의미를 잘모르겠어서 검색해봤어요
    http://m-youngzzang-for20.tistory.com/158
    이해하는데 조금은 도움이 되었습니다 다른분들도 참고하세요
  13. 리브
    mkdir test가 -> mkdir test3가
    성공했을 때 cd test2; -> 성공했을 때 cd test3;

    오타인것 같네융! 좋은 강의 감사히 잘 봤습니다
  14. 최동희
    참고 링크 보니 BASH 정리된 문서가 있군요!!
    종종 이 문서도 찾아봐야겠네요.
    http://www.gnu.org......tml
  15. 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 자세히 보기