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 / 명령어 / gunzip - gzip 압축 파일 풀기

Linux / 명령어 / gunzip - gzip 압축 파일 풀기

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

Linux 강좌 / 프로세스 확인·일시정지·종료하기

Linux 강좌 / 프로세스 확인·일시정지·종료하기

ps, top, pgrep으로 프로세스의 상태와 자원 사용량을 확인합니다. 실습 프로세스에 STOP, CONT, TERM을 보내고 셸 작업과 서비스의 차이를 익힙니다.

Linux / 명령어 / sudo - 다른 사용자 권한으로 명령 실행

Linux / 명령어 / sudo - 다른 사용자 권한으로 명령 실행

Linux sudo 명령어로 허용된 명령을 root 또는 다른 사용자 권한으로 실행하는 방법을 설명합니다. 주요 옵션, 인증 캐시, 리디렉션 문제, visudo와 최소 권한 sudoers 설정 원칙을 정리합니다.

Linux / 명령어 / sync - 버퍼에 남은 쓰기 데이터 저장 요청

Linux / 명령어 / sync - 버퍼에 남은 쓰기 데이터 저장 요청

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

Linux 강좌 / 파일 종류와 정보 확인하기 - ls, file, stat, readlink

Linux 강좌 / 파일 종류와 정보 확인하기 - ls, file, stat, readlink

파일 이름과 실제 형식의 차이를 이해하고 ls, file, stat, readlink로 파일 종류와 크기·권한·시각·링크 정보를 확인합니다.

Linux 강좌 / 사용자·그룹과 파일 소유권 이해하기

Linux 강좌 / 사용자·그룹과 파일 소유권 이해하기

UID, GID, 기본·추가 그룹과 파일 소유권의 의미를 설명합니다. id, groups, getent, ls, stat으로 현재 계정과 파일의 소유 정보를 안전하게 확인합니다.

Linux / 명령어 / curl - URL 요청과 HTTP 응답 확인

Linux / 명령어 / curl - URL 요청과 HTTP 응답 확인

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

Linux / 명령어 / env - 환경 변수 설정과 명령 실행

Linux / 명령어 / env - 환경 변수 설정과 명령 실행

Linux env 명령어로 환경 변수를 추가·제거하거나 깨끗한 환경에서 프로그램을 실행하는 방법을 설명합니다. env -i·-u·-C, shebang 활용과 printenv와의 차이를 다룹니다.

Linux / 명령어 / whoami - 현재 유효 사용자 이름 확인

Linux / 명령어 / whoami - 현재 유효 사용자 이름 확인

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

Linux / 명령어 / tail - 파일의 마지막 내용과 로그 실시간 확인

Linux / 명령어 / tail - 파일의 마지막 내용과 로그 실시간 확인

Linux tail 명령어로 파일의 마지막 행과 바이트를 확인하고 새로 추가되는 로그를 추적하는 방법을 설명합니다. -n, -f, -F 차이와 로그 로테이션, 필터링 및 여러 파일 모니터링 예제를 정리합니다.