Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

PowerShell 환경 변수 완벽 가이드: 조회, 설정, 영구 저장까지

환경 변수(Environment Variables)는 리눅스, macOS, 윈도우 컴퓨터의 전역 설정값으로, 시스템 셸이 명령을 실행할 때 참조할 수 있도록 저장됩니다. 상당수의 환경 변수는 운영체제 설치 과정이나 사용자 계정 생성 시점에 자동으로 설정됩니다.

대표적인 예가 홈 디렉터리입니다. 로그인하면 홈 디렉터리가 환경 변수로 등록되는데, PowerShell에서 이 값이 어떻게 표시되는지는 운영체제에 따라 다릅니다.

윈도우에서:

PS C:\Users\bogus> Get-Variable HOME -valueOnly
C:\Users\bogus

리눅스에서:

pwsh> Get-Variable HOME -valueOnly
HOME=/home/seth

macOS에서:

pwsh> Get-Variable HOME -valueOnly
HOME=/Users/bogus

환경 변수를 직접 다루는 일은 드물지만, 개별 애플리케이션과 데몬(daemon)은 필요할 때마다 이를 참조합니다. 다만 기본 설정을 재정의하거나, 시스템이 스스로 생성하지 않는 새로운 설정을 관리해야 할 때는 환경 변수가 매우 유용합니다.

이 글은 오픈소스 PowerShell 환경의 환경 변수를 다루므로, 윈도우·리눅스·macOS에서 실행되는 PowerShell 모두에 적용됩니다. Bash 셸 사용자라면 Bash 환경 변수를 주제로 한 별도의 글을 참고하시기 바랍니다.

참고로 이 글은 오픈소스 운영체제인 리눅스에서 PowerShell을 실행해 작성했습니다. 명령어 자체는 플랫폼과 무관하게 동일하지만, 출력 결과는 시스템마다 다를 수 있습니다(예를 들어 사용자 이름이 정확히 seth일 가능성은 통계적으로 매우 낮습니다).

환경 변수란 무엇인가?

PowerShell의 환경 변수는 운영체제 환경에 대한 정보를 시스템에 전달하는 특수한 종류의 변수입니다. 이를 통해 Windows 레지스트리에 저장된 변수와 현재 세션에만 설정된 변수를 모두 조회하고 변경할 수 있습니다.

PowerShell에서 환경 변수는 Env: '드라이브'에 저장되며, PowerShell의 하위 시스템인 PowerShell 환경 공급자(environment provider)를 통해 접근할 수 있습니다. 이 드라이브는 물리적인 디스크가 아니라 가상 파일 시스템이라는 점이 특징입니다.

환경 변수가 Env: 드라이브에 존재하기 때문에, 변수를 참조할 때는 이름 앞에 반드시 Env:를 붙여야 합니다. 또는 Set-Location 명령으로 작업 위치를 Env: 드라이브로 옮기면 모든 환경 변수를 지역 변수처럼 편하게 다룰 수 있습니다.

PS> Set-Location Env:
PS> pwd

Path
----
Env:/

환경 변수는 로그인 세션에 대한 정보를 컴퓨터에 전달하는 역할을 합니다. 예를 들어 애플리케이션이 데이터 파일의 기본 저장 위치를 판단해야 할 때, 보통 HOME 환경 변수를 호출합니다. 직접 HOME 변수를 설정한 적은 없을 텐데도 이 변수가 존재하는 이유는, 대부분의 환경 변수가 운영체제에 의해 관리되기 때문입니다.

시스템에 설정된 모든 환경 변수는 Env: 드라이브 안에서 Get-ChildItem 명령으로 확인할 수 있습니다. 목록이 상당히 길기 때문에 out-host -paging으로 파이프(|) 처리하면 한 화면씩 나눠 읽기 편합니다.

PS> Get-ChildItem | out-host -paging
LOGNAME      seth
LS_COLORS    rs=0:mh=00:bd=48;5;232;38;5;
MAIL         /var/spool/mail/seth
MODULEPATH   /etc/scl/modulefiles:/etc/scl/modulefiles
MODULESHOME  /usr/share/Modules
OLDPWD       /home/seth
PATH         /opt/microsoft/powershell/6:/usr/share/Modules/bin
PSModulePath /home/seth/.local/share/powershell/Modules
PWD          /home/seth
[...]

Env: 드라이브에 먼저 이동하지 않았다면, 명령에 Env:를 직접 지정하는 방식으로 동일한 결과를 얻을 수 있습니다.

PS> Get-ChildItem Env: | out-host -paging
LOGNAME      seth
LS_COLORS    rs=0:mh=00:bd=48;5;232;38;5;
MAIL         /var/spool/mail/seth
MODULEPATH   /etc/scl/modulefiles:/etc/scl/modulefiles

환경 변수는 일반 변수와 비슷한 문법으로 설정, 조회, 삭제가 가능합니다. 단, 다른 변수와 마찬가지로 세션 도중 설정한 값은 해당 세션에만 적용됩니다.

변수를 영구적으로 변경하려면 윈도우에서는 Windows 레지스트리를, 리눅스나 macOS에서는 셸 구성 파일(예: ~/.bashrc)을 수정해야 합니다. PowerShell에서 변수를 다루는 게 익숙하지 않다면, 계속 읽기 전에 PowerShell 변수 관련 기초 글을 먼저 살펴보는 것을 권장합니다.

환경 변수는 어떤 용도로 사용될까?

각각의 환경 변수는 컴퓨터 내부의 서로 다른 시스템에서 사용됩니다. 예를 들어 PATH 변수는 셸에게는 생명줄과 같지만, Java 입장에서는 상대적으로 덜 중요합니다(Java 역시 경로를 사용하지만, 일반 시스템 폴더가 아니라 핵심 Java 라이브러리 경로를 의미합니다). 반면 USER 변수는 여러 프로세스가 서비스 요청자가 누구인지 식별하는 데 공통적으로 활용됩니다.

오픈소스 Nullsoft Scriptable Install System(NSIS) 프레임워크처럼 설치 마법사 형태로 동작하는 프로그램은, 새 애플리케이션을 설치하는 과정에서 환경 변수를 자동으로 갱신합니다. 다만 운영체제가 기본 제공하는 도구 체계 밖에서 무언가를 설치할 때는 환경 변수를 직접 관리해야 하는 경우도 있습니다. 또는 단순히 자신의 취향에 맞춰 환경 변수를 추가할 수도 있습니다.

일반 변수와는 어떻게 다를까?

일반 변수를 생성하면 그 변수는 '지역(local)' 변수로 취급됩니다. 즉, 변수를 만든 셸 외부에서는 정의되지 않습니다.

직접 확인해 보겠습니다. 먼저 변수를 하나 만듭니다.

PS> Set-Variable -Name VAR -Value "example"
PS> gv VAR -valueOnly
example

이제 새 셸을 실행해 봅니다. 현재 셸 안에서 자식 셸을 열어도 결과는 같습니다.

PS> pwsh
PS c:\> gv VAR -valueOnly
gv : Cannot find a variable with the name 'example'.

반면 환경 변수는 전역(global) 범위를 갖도록 설계되어 있습니다. 변수를 생성한 셸과 독립적으로 존재하며, 다른 프로세스에서도 자유롭게 사용할 수 있습니다.

환경 변수를 설정하는 방법

환경 변수를 설정할 때는 $Env: 표기법을 사용해 이것이 환경 변수임을 명확히 밝혀야 합니다.

PS Env:/> $Env:FOO = "hello world"
PS Env:/> Get-ChildItem FOO
hello world

테스트 삼아 새 세션을 시작한 뒤 방금 만든 변수에 접근해 보세요. 이 변수는 환경 변수이므로, 접근할 때도 반드시 $Env:를 앞에 붙여야 합니다.

PS Env:/> pwsh
PS c:\> $Env.FOO
hello world

이렇게 하면 자식 프로세스에서도 변수를 사용할 수 있지만, 여전히 임시 변수라는 점에 유의하세요. 값이 정상적으로 동작하고, 존재 여부를 확인할 수 있으며, 어떤 프로세스에서든 사용할 수 있지만, 변수를 만든 셸이 종료되는 순간 함께 사라집니다.

프로필에 환경 변수를 영구 등록하는 방법

세션이 바뀌어도 환경 변수를 유지하려면 PowerShell 프로필에 해당 설정을 추가해야 합니다. 예를 들어 HOME/Documents/Profile.ps1에 위치한 CurrentUser,AllHosts 프로필에 다음과 같이 추가할 수 있습니다.

PS> Add-Content -Path $Profile.CurrentUserAllHosts -Value '$Env:FOO = "hello world"'

이 한 줄을 추가하면, 이후 실행되는 모든 PowerShell 세션이 FOO 환경 변수를 자동으로 생성하고 값을 hello world로 설정합니다.

현재 PowerShell 세션을 제어하는 기본 프로필은 여섯 가지가 존재합니다. 각 프로필의 차이와 용도가 궁금하다면 Microsoft 개발자 블로그의 관련 문서를 참고하세요.

새로운 환경 변수를 찾는 방법

환경 변수는 누구나 자유롭게 만들고 조작할 수 있으며, 실제로 그렇게 하는 애플리케이션도 있습니다. 이 말은 곧, 시스템에 존재하는 많은 환경 변수가 대부분의 애플리케이션에서 사용되지 않으며, 사용자가 임의로 추가한 변수 중 일부는 아무 곳에서도 쓰이지 않을 수 있다는 뜻입니다.

그렇다면 어떤 환경 변수가 실질적으로 의미가 있는지는 어떻게 알 수 있을까요? 답은 각 애플리케이션의 공식 문서에 있습니다.

예를 들어 Python은 설치 과정에서 Path 환경 변수에 적절한 Python 경로를 추가할지 묻습니다. 이때 거절했다 해도, 이제 환경 변수를 수정하는 방법을 알았으니 언제든 직접 값을 설정할 수 있습니다.

설치하는 모든 애플리케이션도 마찬가지입니다. 원칙적으로 설치 프로그램이 필요한 변수를 환경에 알아서 추가해야 하므로, 사용자가 Env: 드라이브를 수동으로 수정할 일은 없어야 합니다. 직접 애플리케이션을 개발하는 입장이라면, 배포용 설치 프로그램이 사용자를 위해 동일한 작업을 수행하도록 만들어야 합니다.

결론적으로, 개별 애플리케이션에서 중요한 환경 변수가 무엇인지 확인하려면 해당 애플리케이션의 사용자 문서와 개발자 문서를 참고하는 것이 가장 확실한 방법입니다.