Linux / 명령어 / env - 환경 변수 설정과 명령 실행
env는 환경 변수를 확인하거나, 일부 환경 변수를 추가·변경·제거한 상태에서 명령을 실행하는 GNU Coreutils 명령입니다. 현재 셸을 직접 바꾸지 않고 특정 프로세스에만 다른 환경을 전달하고 싶을 때 특히 유용합니다.
인수 없이 실행하면 현재 전달된 환경을 출력하지만, 조회만 필요하다면 printenv가 의도를 더 분명하게 보여 줍니다. env의 핵심 용도는 “변경된 환경에서 명령 실행”입니다.
env 명령어란?
프로세스는 부모 프로세스로부터 환경 변수 집합을 전달받습니다. env는 이 집합을 바탕으로 변수를 추가하거나 제거한 새 환경을 구성한 뒤 지정한 명령을 실행합니다. 변경 사항은 실행된 자식 프로세스와 그 자식에게 전달될 수 있지만, 원래 셸의 환경은 바뀌지 않습니다.
기본 문법
env [옵션] [이름=값]... [명령 [인수]...]
명령을 지정하지 않으면 결과 환경을 출력합니다.
env env | sort
환경 변수에는 비밀값이 포함될 수 있으므로 전체 출력을 게시물, 지원 요청이나 공용 로그에 그대로 붙이지 마세요.
한 명령에만 환경 변수 설정하기
env APP_ENV=production ./start.sh env LANG=C sort names.txt
APP_ENV와 LANG은 실행되는 명령의 환경에만 적용됩니다. 명령이 끝난 뒤 현재 셸의 같은 변수는 새로 생기거나 변경되지 않습니다.
printenv APP_ENV
여러 변수를 왼쪽에서 오른쪽 순서로 지정할 수 있습니다.
env HOST=127.0.0.1 PORT=8080 DEBUG=1 ./server
현재 셸의 대입문과 env 비교
POSIX 계열 셸에서는 명령 앞에 직접 이름=값을 붙여도 해당 명령의 환경을 설정할 수 있습니다.
LANG=C sort names.txt env LANG=C sort names.txt
단순한 경우 두 형식의 결과는 비슷합니다. env는 환경 비우기, 변수 제거, 작업 디렉터리 변경과 스크립트 인터프리터 검색 같은 추가 기능이 필요할 때 유용합니다.
환경을 비우고 실행하는 -i
env -i /usr/bin/printenv
-i 또는 --ignore-environment는 기존 환경을 무시하고 빈 환경에서 시작합니다. 재현성 테스트나 숨은 환경 의존성을 찾을 때 유용하지만, PATH, HOME, 로캘과 인증 관련 변수까지 사라질 수 있습니다.
필요한 변수만 명시적으로 다시 넣어 실행할 수 있습니다.
env -i PATH=/usr/bin:/bin HOME="$HOME" LANG=C /usr/bin/env
PATH가 없으면 명령 검색에 실패할 수 있으므로 절대 경로를 사용하거나 필요한 경로를 함께 지정하세요.
특정 변수만 제거하는 -u
env -u HTTP_PROXY curl https://example.com env --unset=DEBUG ./start.sh
-u 이름 또는 --unset=이름은 지정한 변수를 결과 환경에서 제거합니다. 프록시, 디버그 또는 테스트 변수가 프로그램 동작에 미치는 영향을 확인할 때 사용할 수 있습니다.
변수를 빈 문자열로 설정하는 것과 제거하는 것은 다릅니다.
env DEBUG= ./start.sh env -u DEBUG ./start.sh
프로그램에 따라 “변수가 존재하지만 값이 비어 있음”과 “변수가 존재하지 않음”을 다르게 처리할 수 있습니다.
다른 디렉터리에서 실행하는 -C
env -C /srv/app ./start.sh env --chdir=/srv/app APP_ENV=production ./start.sh
GNU env의 -C 또는 --chdir은 지정한 디렉터리로 이동한 뒤 명령을 실행합니다. 현재 셸의 작업 디렉터리는 바뀌지 않습니다. 이 옵션은 GNU 확장이므로 이식성이 필요한 스크립트에서는 지원 여부를 확인하세요.
자주 쓰는 옵션
| 옵션 | 설명 |
|---|---|
-i, --ignore-environment |
기존 환경을 무시하고 빈 환경에서 시작합니다. |
-u 이름, --unset=이름 |
결과 환경에서 지정한 변수를 제거합니다. |
-C 디렉터리, --chdir=디렉터리 |
지정한 디렉터리로 이동한 뒤 명령을 실행합니다. |
-S 문자열, --split-string=문자열 |
문자열을 여러 인수로 나눕니다. 주로 shebang에서 여러 인수를 전달할 때 사용합니다. |
-0, --null |
환경을 출력할 때 줄바꿈 대신 NUL 문자로 항목을 구분합니다. |
지원 옵션은 Coreutils 버전에 따라 다를 수 있습니다. 배포판의 env --help와 공식 매뉴얼을 함께 확인하세요.
스크립트 첫 줄에서 /usr/bin/env 사용하기
스크립트의 shebang에서 인터프리터를 PATH로 찾게 할 수 있습니다.
#!/usr/bin/env python3
인터프리터가 시스템마다 다른 경로에 설치될 수 있는 개발 환경에서 편리합니다. 하지만 현재 PATH에서 먼저 발견되는 프로그램을 실행하므로, 보안과 재현성이 중요한 시스템 서비스에서는 검증된 절대 경로가 더 적합할 수 있습니다.
여러 인터프리터 인수 전달
GNU Coreutils가 -S를 지원하는 환경에서는 shebang 문자열을 여러 인수로 분리할 수 있습니다.
#!/usr/bin/env -S python3 -I
-S는 모든 운영체제의 env에서 지원되는 기능이 아닙니다. 배포 대상 시스템을 확인하고, 높은 이식성이 필요하면 인터프리터 인수를 스크립트 내부에서 처리하는 방법을 검토하세요.
셸 변수와 환경 변수의 차이
셸에 변수를 만들었다고 해서 자동으로 자식 프로세스에 전달되는 것은 아닙니다.
LOCAL_ONLY=value printenv LOCAL_ONLY export LOCAL_ONLY printenv LOCAL_ONLY
export된 변수만 새로 실행되는 프로그램의 환경에 포함됩니다. env는 현재 셸 변수 전체가 아니라 자신에게 전달된 환경을 기준으로 동작합니다.
env와 printenv 비교
| 구분 | env |
printenv |
|---|---|---|
| 주요 목적 | 변경된 환경에서 명령 실행 | 환경 변수 값 조회 |
| 전체 환경 출력 | 명령을 생략하면 가능 | 변수 이름을 생략하면 가능 |
| 특정 변수 조회 | 전용 형식이 없어 필터가 필요합니다. | printenv HOME처럼 직접 조회합니다. |
| 변수 추가·제거 | 지원합니다. | 지원하지 않습니다. |
| 명령 실행 | 지원합니다. | 지원하지 않습니다. |
보안과 운영 시 주의점
- 토큰, 암호와 개인 키 경로가 포함된 전체 환경을 로그로 남기지 않습니다.
env 이름=값 명령에 비밀값을 직접 적으면 셸 기록이나 프로세스 정보에 노출될 가능성을 검토해야 합니다.env -i로 인증서 경로, 로캘과 프록시 변수가 빠져 동작이 달라질 수 있습니다.- shebang의
/usr/bin/env는PATH의 영향을 받으므로 실행 주체와 환경을 신뢰할 수 있는지 확인합니다. - 서비스 환경은 가능하면 서비스 관리자의 명시적인 환경 설정 기능을 사용합니다.
자주 묻는 질문
env로 설정한 변수가 현재 터미널에 남나요?
아닙니다. env 이름=값 명령은 실행한 명령의 환경만 바꾸며 부모 셸의 변수를 수정하지 않습니다.
env와 export는 무엇이 다른가요?
export는 현재 셸 변수를 이후에 실행할 자식 프로세스의 환경으로 내보내도록 표시합니다. env는 한 번의 명령 실행을 위한 환경을 구성하는 데 적합합니다.
env -i에서 명령을 찾지 못합니다.
기존 PATH까지 제거되었기 때문일 수 있습니다. 실행 파일의 절대 경로를 사용하거나 필요한 PATH를 명시적으로 설정하세요.









