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를 명시적으로 설정하세요.

관련 글과 공식 문서

같은 카테고리의 다른 글
Linux / 명령어 / awk - 필드별 텍스트 분석과 계산

Linux / 명령어 / awk - 필드별 텍스트 분석과 계산

Linux awk 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / csplit - 행 번호·패턴에서 파일 분할

Linux / 명령어 / csplit - 행 번호·패턴에서 파일 분할

Linux csplit 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / ln - 하드 링크와 심볼릭 링크 생성

Linux / 명령어 / ln - 하드 링크와 심볼릭 링크 생성

Linux ln 명령어로 하드 링크와 심볼릭 링크를 만드는 방법을 설명합니다. 두 링크의 차이, 상대 경로, 깨진 링크와 기존 링크 교체 시 주의점도 정리합니다.

Linux / 명령어 / ping - 호스트 응답과 왕복 시간 확인

Linux / 명령어 / ping - 호스트 응답과 왕복 시간 확인

Linux ping 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / realpath - 절대 경로와 실제 경로 확인

Linux / 명령어 / realpath - 절대 경로와 실제 경로 확인

Linux realpath 명령어로 상대 경로와 심볼릭 링크를 정규화하고 절대·상대 경로를 출력하는 방법을 설명합니다. 경로 존재 조건과 보안상 주의점도 함께 정리합니다.

Linux / 명령어 / lsmod - 로드된 커널 모듈 확인

Linux / 명령어 / lsmod - 로드된 커널 모듈 확인

Linux lsmod 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / tar - 여러 파일을 묶고 압축 아카이브 풀기

Linux / 명령어 / tar - 여러 파일을 묶고 압축 아카이브 풀기

Linux tar 명령어의 용도와 기본 문법을 알아봅니다. 파일 처리 예제, 주요 옵션과 원본 보존·덮어쓰기 주의점을 설명합니다.

Linux 강좌 / PID와 PPID 이해하기 - 프로세스 확인과 관리

Linux 강좌 / PID와 PPID 이해하기 - 프로세스 확인과 관리

PID와 PPID의 의미와 부모·자식 프로세스의 관계를 설명합니다. ps와 pgrep으로 확인하고, 직접 만든 실습 프로세스를 안전하게 종료하는 방법을 익힙니다.

Linux / 명령어 / who - 현재 로그인 세션 확인

Linux / 명령어 / who - 현재 로그인 세션 확인

Linux who 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / mount - 파일 시스템 연결 상태 확인과 마운트

Linux / 명령어 / mount - 파일 시스템 연결 상태 확인과 마운트

Linux mount 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.