Linux 강좌 / 셸의 명령 실행 방식 - ;, &&, ||, 별칭과 환경 변수
Bash는 명령을 읽어 이름과 인수를 해석하고, 필요한 확장·리디렉션을 적용한 뒤 실행합니다. ;는 앞 명령의 성공 여부와 관계없이 다음 명령을, &&는 성공했을 때만, ||는 실패했을 때만 다음 명령을 실행합니다. 별칭은 읽는 시점에 명령어를 바꾸고, 환경 변수는 자식 프로세스에 전달되는 설정입니다. 이 차이를 알면 같은 글자를 입력해도 결과가 달라지는 이유를 설명할 수 있습니다.
명령 이름은 어떻게 결정될까요?
이 강좌의 예시는 Bash를 기준으로 합니다. 셸은 명령줄을 읽고 인수·변수·리디렉션을 처리한 뒤 명령 이름을 해석합니다. 이름이 별칭, 함수, 셸 내장 명령인지, 아니면 PATH에서 찾은 실행 파일인지에 따라 실제 동작이 달라질 수 있습니다. 현재 셸의 해석을 확인하려면 다음을 실행하세요.
type -a printf type -a ls command -v ls
type -a의 출력은 별칭·함수·내장 명령·실행 파일 후보를 보여 줄 수 있습니다. command -v는 명령 이름을 찾을 수 있는지 확인할 때 쓸 수 있습니다. PATH는 외부 실행 파일을 찾는 디렉터리 목록이며, 별칭이나 함수까지 파일 경로 하나로 설명하지는 못합니다. 시스템의 PATH를 실습을 위해 임의로 덮어쓰지 마세요.
종료 상태로 다음 명령 실행하기
셸 명령은 종료 상태를 남깁니다. 관례적으로 0은 성공, 0이 아닌 값은 실패나 특정 결과를 뜻합니다. 예를 들어 grep은 찾는 줄이 없을 때 1을 반환할 수 있습니다. $?는 가장 최근에 실행된 명령의 상태이므로 확인하려면 바로 사용해야 합니다.
false echo $?
Bash의 false는 실패 상태를 반환하므로 출력은 1입니다. 다음 표는 명령을 연결하는 연산자의 기본 의미입니다.
| 표기 | 오른쪽 명령의 실행 조건 | 용도 |
|---|---|---|
; |
왼쪽 결과와 관계없이 실행 | 명령을 순서대로 나열 |
&& |
왼쪽 종료 상태가 0일 때 |
앞 단계가 성공해야 진행 |
|| |
왼쪽 종료 상태가 0이 아닐 때 |
실패 시 대안 실행 |
false && printf 'not run\n' false || printf 'fallback\n' true; printf 'always\n'
위 세 줄을 순서대로 실행하면 not run은 출력되지 않고 fallback과 always만 보입니다. &&와 ||는 Bash에서 우선순위가 같고 왼쪽부터 결합합니다. 따라서 작업 && 성공처리 || 실패처리는 ‘성공처리’ 자체가 실패하면 실패처리까지 실행될 수 있습니다. 두 갈래의 뜻을 정확히 표현해야 한다면 if ...; then ...; else ...; fi가 더 명확합니다.
별칭은 셸이 읽을 때 확장됩니다
alias는 대화형 Bash에서 자주 쓰는 명령의 짧은 이름을 만듭니다. 다음 줄을 입력한 뒤 새 프롬프트에서 ll 또는 type ll을 실행해 보세요. Bash는 명령줄을 실행하기 전에 읽고 해석하므로, 별칭 정의와 사용을 한 줄의 복합 명령으로 묶으면 기대대로 확장되지 않을 수 있습니다.
alias ll='ls -l'
type ll ll
별칭은 기본적으로 현재 셸에만 적용되고, 비대화형 Bash에서는 별도 설정 없이 확장되지 않습니다. 실제 자동화 스크립트가 별칭에 의존한다고 가정하지 마세요. 실습을 마치면 unalias ll로 지울 수 있습니다. 인수를 받아 재사용해야 하는 동작은 별칭보다 셸 함수를 검토하는 편이 낫습니다.
셸 변수와 환경 변수 구별하기
셸 변수는 현재 셸에서 사용할 수 있고, export한 변수는 이후 실행하는 자식 프로세스의 환경에도 들어갑니다. 아래 예제는 흔한 시스템 변수 대신 실습 전용 이름을 사용합니다.
LESSON_MODE=practice printf '%s\n' "$LESSON_MODE" export LESSON_MODE printenv LESSON_MODE
두 출력 모두 practice입니다. 첫 출력은 현재 셸의 변수 확장 결과이고, 둘째 출력은 외부 printenv 프로세스가 전달받은 환경을 읽은 결과입니다. export는 이미 실행 중인 다른 셸이나 부모 프로세스를 거꾸로 바꾸지 않습니다.
한 명령에만 값을 전달하려면 이름=값 명령 형식을 사용할 수 있습니다. 실습 변수를 정리할 때는 현재 셸에서 unset LESSON_MODE를 실행하세요. 사용자 홈 디렉터리나 시스템 PATH 같은 중요한 변수는 실습용 이름으로 재사용하지 마세요.
실행 순서를 점검하는 방법
- 명령이 무엇으로 해석되는지 모르면
type -a 이름부터 확인합니다. - 조건부 실행이 예상과 다르면 각 단계의 종료 상태를 분리해 확인합니다.
- 별칭이 동작하지 않으면 대화형 셸인지, 정의 후 새 명령줄에서 실행했는지 확인합니다.
- 자식 명령이 변수를 못 읽으면
export여부를 확인합니다.
세미콜론과 조건 연산자, 별칭과 변수는 모두 ‘명령 실행 방식’에 관여하지만 같은 기능은 아닙니다. 실제 파일을 바꾸는 명령을 연결하기 전에는 먼저 true, false, printf처럼 부작용이 작은 명령으로 흐름을 확인하세요.
공식 문서
GNU Bash 명령 목록 문서는 ;·&&·||의 결합 규칙을, Bash 별칭 문서는 확장 시점을 설명합니다. 변수와 환경은 Bash Reference Manual에서 확인할 수 있습니다.









