Post

쉘(Shell)에서 `&`, `&&`, `;` 의 차이

쉘(Shell)에서 `&`, `&&`, `;` 의 차이

쉘(Shell)에서 &, &&, ; 의 차이

리눅스/유닉스 쉘에서 명령어를 연결할 때 자주 사용하는 연산자가 있습니다. 대표적으로 &, &&, ; 인데, 각각 의미와 실행 방식이 다릅니다. 헷갈리기 쉬운 부분을 정리해보겠습니다.


1. & : 백그라운드 실행

명령어 끝에 &를 붙이면 해당 명령이 백그라운드 프로세스로 실행됩니다. 즉, 쉘은 해당 명령이 끝날 때까지 기다리지 않고 바로 다음 명령을 받을 수 있습니다.

1
2
3
$ long_running_command &
[1] 12345    # 작업 번호와 PID 출력
$ echo "프롬프트가 바로 반환됨"

👉 결과적으로 a & b 라고 쓰면:

  • a는 백그라운드 실행
  • 그와 동시에 b가 포어그라운드에서 실행됨 → 겹쳐 돌아가기 때문에 “동시 실행”처럼 동작

2. && : 조건부 실행 (앞이 성공해야 뒤 실행)

&&앞 명령이 성공(종료 코드 0)했을 때만 뒤 명령을 실행합니다. 실패하면 뒤 명령은 실행되지 않습니다.

1
$ mkdir mydir && cd mydir
  • mkdir mydir 성공 → cd mydir 실행
  • mkdir mydir 실패 → cd mydir 실행되지 않음
1
2
3
4
5
$ true && echo "성공했으니 실행"
성공했으니 실행

$ false && echo "성공했으니 실행"
# 출력 없음

3. ; : 순차 실행 (성공/실패와 무관)

;는 단순히 명령어를 순서대로 실행하는 의미입니다. 앞 명령어가 실패해도 뒤 명령은 무조건 실행됩니다.

1
2
$ false ; echo "실행됨"
실행됨   # 앞 명령 실패했어도 실행
1
2
$ mkdir mydir ; cd mydir
# mydir 생성 실패해도 cd 실행 → 에러 발생 가능

4. 비교 정리

구문실행 조건실행 방식
a &a를 백그라운드 실행동시에 다른 명령 실행 가능
a ; ba 실행 후 무조건 b 실행순차 실행
a && ba성공했을 때만 b 실행조건부 실행

5. 추가 Tip: || (앞이 실패했을 때 실행)

||&&와 반대로, 앞 명령이 실패했을 때만 뒤 명령을 실행합니다.

1
2
3
4
5
$ false || echo "앞이 실패했으니 실행"
앞이 실패했으니 실행

$ true || echo "앞이 실패했으니 실행"
# 출력 없음

명령의 그룹핑

mkdir test 성공했을 경우 {}안의 명령어 그룹을 실행, 실패했을 경우 || 뒤의 명령어를 실행

1
mkdir test && { cd test; touch abc; echo 'success!!' } || echo 'fail to make dir';

✅ 요약

  • 동시에 실행하고 싶으면 &
  • 성공했을 때만 다음 실행은 &&
  • 그냥 순차 실행은 ;
  • 실패했을 때만 실행하고 싶으면 ||
This post is licensed under CC BY 4.0 by the author.