about_Environment_Variables

about_Environment_Variables

PowerShell에서 환경 변수를 읽고 관리하는 방법을 알아봐요. 운영체제와 다른 프로그램들이 쓰는 환경 변수의 개념부터, PowerShell로 환경 변수를 다루는 여러 방법까지 차근차근 설명해 드릴게요.

출처: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_environment_variables

본문

간단한 설명

PowerShell에서 환경 변수에 접근하고 관리하는 방법을 설명해요.

자세한 설명

환경 변수는 운영체제와 다른 프로그램이 사용하는 데이터를 저장해요. PowerShell은 다음 환경 변수들을 만들어요.

  • POWERSHELL_TELEMETRY_OPTOUT
  • POWERSHELL_DISTRIBUTION_CHANNEL
  • POWERSHELL_UPDATECHECK
  • POWERSHELL_DIAGNOSTICS_OPTOUT
  • PSExecutionPolicyPreference
  • PSModulePath
  • PSModuleAnalysisCachePath
  • PSDisableModuleAnalysisCacheCleanup

이 변수들에 대한 자세한 설명은 이 문서의 PowerShell 환경 변수 부분에서 다룰게요.

PowerShell은 지원되는 모든 운영체제 플랫폼에서 환경 변수에 접근하고 관리할 수 있어요. PowerShell의 Environment provider를 쓰면 현재 콘솔에서 환경 변수를 가져오고(get), 추가하고(add), 변경하고(change), 지우고(clear), 삭제할 수 있어요(delete).

참고

Windows와 달리 macOS와 Linux에서는 환경 변수 이름이 대소문자를 구분해요. 예를 들어 $Env:Path$Env:PATH는 Windows가 아닌 플랫폼에서는 서로 다른 환경 변수예요.

환경 변수는 PowerShell의 다른 타입 변수와 달리 항상 문자열로 저장돼요. 또 다른 변수들과 달리 자식 프로세스에 상속돼요. 예를 들어 로컬 백그라운드 작업이나 모듈 멤버가 실행되는 세션에 그대로 전달되지요. 그래서 환경 변수는 부모 프로세스와 자식 프로세스 양쪽에서 필요한 값을 저장할 때 아주 적합해요.

Windows에서는 환경 변수를 세 가지 범위(scope)로 정의할 수 있어요.

  • Machine(또는 System) 범위
  • User 범위
  • Process 범위

Process 범위에는 현재 프로세스, 즉 PowerShell 세션에서 사용 가능한 환경 변수가 들어 있어요. 이 변수 목록은 부모 프로세스에서 상속받은 것이고, Machine 범위와 User 범위의 변수들로 구성돼요.

PowerShell에서 환경 변수를 바꾸면 그 변경은 현재 세션에만 영향을 줘요. 이 동작은 Windows Command Shell의 set 명령이나 Unix 계열 환경의 setenv 명령과 비슷해요. Machine 범위나 User 범위의 값을 바꾸려면 System.Environment 클래스의 메서드를 써야 해요.

Machine 범위의 변수를 바꾸려면 권한도 필요해요. 권한이 충분하지 않은 채 값을 바꾸려고 하면 명령이 실패하고 PowerShell이 오류를 보여줘요.

PowerShell은 환경 변수를 사용하고 관리하는 여러 방법을 제공해요.

  • 변수 구문
  • Environment provider와 Item cmdlet
  • .NET의 System.Environment 클래스

변수 구문 사용하기

다음 구문으로 환경 변수의 값을 표시하고 변경할 수 있어요.

$Env:<variable-name>

예를 들어 windir 환경 변수의 값을 표시하려면:

$Env:windir

출력:

C:\Windows

이 구문에서 달러 기호($)는 변수를 나타내고, 드라이브 이름(Env:)은 환경 변수를 의미해요. 그 뒤에 오는 windir가 변수 이름이에요.

다음 구문으로 환경 변수의 값을 새로 만들거나 갱신할 수 있어요.

$Env:<variable-name> = "<new-value>"

예를 들어 Foo 환경 변수를 만들려면:

$Env:Foo = 'An example'

환경 변수는 항상 문자열이기 때문에 문자열을 담는 다른 변수처럼 쓸 수 있어요. 예를 들어:

"The 'Foo' environment variable is set to: $Env:Foo"
$Env:Foo += '!'
$Env:Foo

출력:

The 'Foo' environment variable is set to: An example
An example!

PowerShell 7.5부터 환경 변수를 빈 문자열로 설정할 수 있어요. 환경 변수를 $null로 설정하면 현재 세션에서 그 변수가 제거돼요. 예를 들어:

PS> $env:TEST = ''
PS> Get-ChildItem env:TEST
Name                           Value
----                           -----
TEST
PS> $env:TEST = $null
PS> $env:TEST.Length
0
PS> Get-ChildItem env:TEST
Get-ChildItem: Cannot find path 'TEST' because it does not exist.

PowerShell의 변수에 대한 자세한 내용은 about_Variables를 참고해요.

Environment provider와 Item cmdlet 사용하기

PowerShell의 Environment provider는 환경 변수를 파일 시스템 드라이브를 다루는 것처럼 상호작용할 수 있는 인터페이스를 제공해요. 이걸로 PowerShell에서 환경 변수와 값을 가져오고, 추가하고, 변경하고, 지우고, 삭제할 수 있어요.

예를 들어 값이 BarFoo 환경 변수를 만들려면:

New-Item -Path Env:\Foo -Value 'Bar'
Name                           Value
----                           -----
Foo                            Bar

환경 변수를 복사할 때는 Copy-Item을, 값을 설정할 때는 Set-Item을, 나열할 때는 Get-Item을, 삭제할 때는 Remove-Item을 쓸 수 있어요.

Copy-Item -Path Env:\Foo -Destination Env:\Foo2 -PassThru
Set-Item -Path Env:\Foo2 -Value 'BAR'
Get-Item -Path Env:\Foo*
Remove-Item -Path Env:\Foo* -Verbose

출력:

Name                           Value
----                           -----
Foo2                           Bar
Name                           Value
----                           -----
Foo2                           BAR
Foo                            Bar
VERBOSE: Performing the operation "Remove Item" on target "Item: Foo2".
VERBOSE: Performing the operation "Remove Item" on target "Item: Foo".

Get-ChildItem cmdlet을 쓰면 환경 변수의 전체 목록을 볼 수 있어요.

Get-ChildItem Env:

PowerShell 7.5부터는 environment provider와 Set-Item cmdlet을 써서 환경 변수를 빈 문자열로 설정할 수 있어요. 환경 변수를 $null로 설정하면 현재 세션에서 제거돼요. 예를 들어:

PS> Set-Item env:TEST 'Foo'
PS> Get-ChildItem env:TEST
Name                           Value
----                           -----
TEST                           Foo
PS> Set-Item env:TEST ''
PS> Get-ChildItem env:TEST
Name                           Value
----                           -----
TEST
PS> Set-Item -Path env:TEST -Value $null
PS> Get-ChildItem env:TEST
Get-ChildItem: Cannot find path 'TEST' because it does not exist.

Environment provider를 써서 환경 변수를 관리하는 자세한 내용은 about_Environment_Provider를 참고해요.

System.Environment 메서드 사용하기

System.Environment 클래스는 환경 변수를 가져오고 수정하는 GetEnvironmentVariable() 메서드와 SetEnvironmentVariable() 메서드를 제공해요.

다음 예제는 값이 Bar인 새 환경 변수 Foo를 만들고 그 값을 반환해요.

[Environment]::SetEnvironmentVariable('Foo','Bar')
[Environment]::GetEnvironmentVariable('Foo')

출력:

Bar

PowerShell 7.5부터는 SetEnvironmentVariable() 메서드로 환경 변수를 빈 문자열로 설정할 수 있어요. 값에 빈 문자열이나 $null을 지정하면 되지요. 예를 들어:

PS> [Environment]::SetEnvironmentVariable('Foo','Bar')
PS> Get-ChildItem env:Foo
Name                           Value
----                           -----
Foo                            Bar
PS> [Environment]::SetEnvironmentVariable('Foo','')
PS> Get-ChildItem env:Foo
Name                           Value
----                           -----
Foo
PS> [Environment]::SetEnvironmentVariable('Foo','bar')
PS> Get-ChildItem env:Foo
Name                           Value
----                           -----
Foo                            bar
PS> [Environment]::SetEnvironmentVariable('Foo',$null)
PS> Get-ChildItem env:Foo
Name                           Value
----                           -----
Foo

참고

변수 구문이나 provider의 경우와 달리, SetEnvironmentVariable() 메서드로 값을 $null로 설정해도 환경 변수가 제거되지는 않아요.

System.Environment 클래스의 메서드에 대한 자세한 내용은 Environment Methods를 참고해요.

Windows에서 영구 환경 변수 만들기

Windows에서는 환경 변수 변경을 영구적으로 만드는 세 가지 방법이 있어요.

  • 프로필에서 설정하기
  • SetEnvironmentVariable() 메서드 사용하기
  • 시스템 제어판(System Control Panel) 사용하기

프로필에서 환경 변수 설정하기

PowerShell 프로필에서 추가하거나 변경한 환경 변수는 그 프로필을 로드하는 모든 세션에서 사용할 수 있어요. 이 방법은 지원되는 모든 플랫폼의 모든 PowerShell 버전에서 동작해요.

예를 들어 CompanyUri 환경 변수를 만들고 PATH 환경 변수에 C:\Tools 폴더를 추가하려면, PowerShell 프로필에 다음 줄을 추가해요.

$Env:CompanyUri = 'https://internal.contoso.com'
$Env:PATH += ';C:\Tools'

참고

Linux나 macOS에서는 목록에서 앞 경로와 새 경로를 구분할 때 세미콜론(;) 대신 콜론(:)을 사용해요.

PowerShell 프로필의 경로는 $PROFILE 자동 변수로 알 수 있어요. 프로필에 대한 자세한 내용은 about_Profiles를 참고해요.

SetEnvironmentVariable() 메서드로 환경 변수 설정하기

Windows에서는 SetEnvironmentVariable() 메서드의 세 번째 매개 변수로 범위를 지정해서 그 범위에 환경 변수를 설정할 수 있어요. machine 범위와 user 범위는 모두 현재 프로세스 밖에서도 유지돼요. 그래서 새 환경 변수를 저장하거나 기존 변수를 변경해서 저장할 수 있지요.

예를 들어 값이 Bar인 새 환경 변수 Foo를 machine 범위로 저장하려면:

[Environment]::SetEnvironmentVariable('Foo', 'Bar', 'Machine')

user 범위나 machine 범위의 환경 변수는 값을 빈 문자열로 설정해서 삭제할 수 있어요.

[Environment]::SetEnvironmentVariable('Foo', '', 'Machine')

시스템 제어판에서 환경 변수 설정하기

시스템 제어판(System Control Panel)에서는 User 범위와 System(Machine) 범위의 환경 변수를 추가하거나 편집할 수 있어요. Windows는 이 값을 레지스트리에 기록해서 세션과 시스템 재시작을 넘어서도 유지돼요.

Windows에서 시스템 제어판으로 환경 변수를 영구적으로 변경하려면:

  • 시스템 제어판을 열어요.
  • 시스템(System)을 선택해요.
  • 고급 시스템 설정(Advanced System Settings)을 선택해요.
  • 고급(Advanced) 탭으로 이동해요.
  • 환경 변수(Environment Variables...)를 선택해요.
  • 변경사항을 적용해요.

Windows가 아닌 플랫폼에서 영구 환경 변수 만들기

Linux와 macOS에는 응용 프로그램을 시작하기 전에 운영체제가 환경 변수를 설정하는 데 사용하는 설정 파일과 스크립트가 있어요.

PowerShell을 기본(로그인) 셸로 실행한다면 운영체제가 지원하는 전역 초기화 파일에서 환경 변수를 정의할 수 있어요. 예를 들어 Linux에서는 /etc/environment 파일에 환경 변수를 추가하거나, 환경 변수를 설정하는 스크립트를 만들어 /etc/profile.d 폴더에 넣을 수 있어요. macOS에서는 /etc/profile 파일에 환경 변수를 추가할 수 있어요.

다른 셸에서 PowerShell을 시작한다면, 로그인이 아닌 셸이 쓰는 셸별 초기화 파일에 환경 변수를 정의할 수 있어요. 예를 들어 bash에서는 ~/.bashrc, zsh에서는 ~/.zshrc 같은 파일이에요.

자세한 내용은 운영체제와 기본 셸의 문서를 참고해요.

PowerShell 환경 변수

PowerShell 기능은 환경 변수를 써서 사용자 기본 설정을 저장할 수 있어요. 이 변수들은 기본 설정 변수(preference variable)처럼 동작하지만, 만들어지는 세션의 자식 세션에 상속돼요. 기본 설정 변수에 대한 자세한 내용은 about_Preference_Variables를 참고해요.

기본 설정을 저장하는 환경 변수는 다음과 같아요.

  • POWERSHELL_TELEMETRY_OPTOUT

    원격 계측(telemetry)을 거부하려면 이 환경 변수를 true, yes, 또는 1로 설정해요. 자세한 내용은 about_Telemetry를 참고해요.

    이 환경 변수가 효력을 가지려면 PowerShell 프로세스를 시작하기 전에 설정해야 해요. 영구 환경 변수를 만드는 방법은 앞의 섹션들을 참고해요.

  • POWERSHELL_DISTRIBUTION_CHANNEL

    PowerShell 7.2부터 이 환경 변수는 설치 프로그램이 PowerShell의 설치 방식과 출처를 기록하기 위해 설정해요.

    이 정보는 Microsoft로 보내는 원격 계측 데이터에 포함돼요. 사용자는 이 값을 바꾸면 안 돼요.

  • POWERSHELL_UPDATECHECK

    업데이트 알림 동작은 POWERSHELL_UPDATECHECK 환경 변수로 바꿀 수 있어요. 자세한 내용은 about_Update_Notifications를 참고해요.

    지원되는 값은 다음과 같아요.

    • Off — 업데이트 알림 기능을 끄기
    • DefaultPOWERSHELL_UPDATECHECK을 정의하지 않은 것과 동일:
      • GA 릴리스는 GA 릴리스로의 업데이트를 알림
      • Preview/RC 릴리스는 GA 및 preview 릴리스로의 업데이트를 알림
      • LTS는 LTS(long-term-servicing) GA 릴리스로의 업데이트만 알림

    기본값이 아닌 환경 변수 값은 PowerShell 프로세스를 시작하기 전에 설정해야 해요. 영구 환경 변수를 만드는 방법은 앞의 섹션들을 참고해요.

  • POWERSHELL_DIAGNOSTICS_OPTOUT

    이 환경 변수는 PowerShell 7.6-preview.5에서 추가됐어요. 기본적으로 PowerShell은 IPC(Interprocess Communication, 프로세스 간 통신)용으로 명명된 파이프(named pipe)를 만들고, 예를 들어 Enter-PSHostProcess 같은 곳에 써요. PowerShell은 시작할 때 이 명명된 파이프를 만들어서 필요할 때 쓸 수 있게 해요.

    Windows가 아닌 플랫폼에서 명명된 파이프는 /tmp 폴더의 파일로 구현돼요. PowerShell이 크래시하면 이 파일이 삭제되지 않을 수 있어요. 시간이 지나면 이런 파일이 쌓이게 되지요.

    PowerShell 7.6부터 POWERSHELL_DIAGNOSTICS_OPTOUTfalse로 설정돼요. 명명된 파이프의 생성을 끄려면 환경 변수를 true, yes, 또는 1로 설정해요.

  • PSExecutionPolicyPreference

    현재 세션에 설정된 실행 정책(execution policy)을 저장해요. 이 환경 변수는 단일 세션에 실행 정책을 설정했을 때만 존재해요. 설정하는 방법은 두 가지가 있어요.

    • 명령줄에서 ExecutionPolicy 매개 변수를 써서 세션을 시작하고 실행 정책을 설정하기
    • Set-ExecutionPolicy cmdlet을 Scope 매개 변수 값 Process로 사용하기
    • 환경 변수를 수동으로 설정하기 — 이 변수의 값을 바꾸면 현재 프로세스의 실행 정책이 바뀌어요.

    이 정보는 Windows 플랫폼에만 적용돼요. 자세한 내용은 about_Execution_Policies를 참고해요.

  • PSModulePath

    $Env:PSModulePath 환경 변수는 모듈과 리소스를 찾기 위해 검색되는 폴더 위치 목록을 담고 있어요. Windows에서는 폴더 위치 목록이 세미콜론(;) 문자로 구분돼요. Windows가 아닌 플랫폼에서는 콜론(:)이 환경 변수의 폴더 위치를 구분해요.

    기본적으로 $Env:PSModulePath에 할당되는 유효한 위치는 다음과 같아요.

    • 시스템 전체 위치: PowerShell과 함께 제공되는 모듈이 들어 있는 폴더예요. 모듈은 $PSHOME\Modules 위치에 저장돼요. 또한 Windows 관리 모듈이 설치되는 위치이기도 해요.
    • 사용자가 설치한 모듈: 사용자가 설치한 모듈이에요. Install-Module에는 현재 사용자용으로 설치할지 모든 사용자용으로 설치할지 지정하는 Scope 매개 변수가 있어요. 자세한 내용은 Install-Module을 참고해요.
    • Windows에서 사용자별 CurrentUser 범위의 위치는 $HOME\Documents\PowerShell\Modules 폴더예요. AllUsers 범위의 위치는 $Env:ProgramFiles\PowerShell\Modules예요.
    • Windows가 아닌 시스템에서 사용자별 CurrentUser 범위의 위치는 $HOME/.local/share/powershell/Modules 폴더예요. AllUsers 범위의 위치는 /usr/local/share/powershell/Modules예요.

    이에 더해 Program Files 디렉터리처럼 다른 디렉터리에 모듈을 설치하는 설치 프로그램은 자신의 위치를 $Env:PSModulePath 값에 추가할 수 있어요.

    자세한 내용은 about_PSModulePath를 참고해요.

  • PSModuleAnalysisCachePath

    PowerShell은 모듈과 그 cmdlet에 대한 데이터를 캐시하는 데 쓰는 파일을 제어할 수 있게 해줘요. 캐시는 시작할 때 명령을 찾는 동안 읽히고, 모듈을 가져온 뒤 얼마 후 백그라운드 스레드에서 작성돼요.

    캐시의 기본 위치는 다음과 같아요.

    • Windows PowerShell 5.1: $Env:LOCALAPPDATA\Microsoft\Windows\PowerShell
    • PowerShell 6.0 이상: $Env:LOCALAPPDATA\Microsoft\PowerShell
    • Windows가 아닌 기본값: ~/.cache/powershell

    캐시의 기본 파일 이름은 ModuleAnalysisCache예요. PowerShell 인스턴스가 여러 개 설치돼 있으면 파일 이름에 16진수 접미사가 붙어서 설치본마다 고유한 파일 이름을 가지게 돼요.

    참고

    명령 검색이 제대로 동작하지 않으면, 예를 들어 IntelliSense가 존재하지 않는 명령을 보여주면 캐시 파일을 삭제할 수 있어요. 다음에 PowerShell을 시작할 때 캐시가 다시 만들어져요.

    캐시의 기본 위치를 바꾸려면 PowerShell을 시작하기 전에 환경 변수를 설정해요. 값은 PowerShell이 파일을 만들고 쓸 수 있는 권한이 있는 전체 경로(파일 이름 포함)를 지정해야 해요.

    이 환경 변수의 변경은 자식 프로세스에만 영향을 줘요. 영구 환경 변수를 만드는 방법은 앞의 섹션들을 참고해요.

    파일 캐시를 비활성화하려면 값을 유효하지 않은 위치로 설정해요. 예를 들어:

    # `NUL` here is a special device on Windows that can't be written to,
    # on non-Windows you would use `/dev/null`
    $Env:PSModuleAnalysisCachePath = 'NUL'
    

    이렇게 하면 경로가 NUL 장치로 설정돼요. PowerShell은 그 경로에 쓸 수 없지만 오류는 반환하지 않아요. 트레이서(tracer)로 보고되는 오류를 볼 수 있어요.

    Trace-Command -PSHost -Name Modules -Expression {
      Import-Module Microsoft.PowerShell.Management -Force
    }
    
  • PSDisableModuleAnalysisCacheCleanup

    모듈 분석 캐시를 작성할 때 PowerShell은 더 이상 존재하지 않는 모듈을 확인해서 불필요하게 커진 캐시를 피해요. 때로는 이런 확인 자체가 바람직하지 않을 수 있어요. 그럴 땐 이 환경 변수 값을 1로 설정해서 확인을 끌 수 있어요.

    이 환경 변수 설정은 현재 프로세스의 이후 정리(cleanup) 이벤트에 효력이 있어요. 시작할 때 정리를 비활성화하려면 PowerShell을 시작하기 전에 환경 변수를 설정해야 해요. 영구 환경 변수를 만드는 방법은 앞의 섹션들을 참고해요.

PowerShell이 사용하는 기타 환경 변수

경로 정보

  • PATH

    $Env:PATH 환경 변수는 운영체제가 실행 파일을 검색하는 폴더 위치 목록을 담고 있어요. Windows에서는 폴더 위치 목록이 세미콜론(;) 문자로 구분돼요. Windows가 아닌 플랫폼에서는 콜론(:)이 환경 변수의 폴더 위치를 구분해요.

  • PATHEXT

    $Env:PATHEXT 변수는 Windows가 실행 파일로 간주하는 파일 확장명 목록을 담고 있어요. 나열된 확장명 중 하나를 가진 스크립트 파일을 PowerShell에서 실행하면, 그 스크립트는 현재 콘솔이나 터미널 세션에서 실행돼요. 확장명이 목록에 없으면 스크립트는 새 콘솔 세션에서 실행돼요.

    다른 스크립팅 언어의 스크립트를 현재 콘솔 세션에서 실행하려면, 그 스크립팅 언어가 쓰는 파일 확장명을 추가해요. 예를 들어 Python 스크립트를 현재 콘솔에서 실행하려면 .py 확장명을 환경 변수에 추가해요. Windows가 .py 확장명을 실행 파일로 지원하게 하려면 CMD 명령 셸의 ftypeassoc 명령으로 파일 확장명을 등록해야 해요. PowerShell에는 파일 처리기를 직접 등록하는 방법이 없어요. 자세한 내용은 ftype 명령의 문서를 참고해요.

    PowerShell 스크립트는 항상 현재 콘솔 세션에서 시작돼요. .ps1 확장명은 추가할 필요 없어요.

  • XDG 변수

    Windows가 아닌 플랫폼에서 PowerShell은 XDG Base Directory Specification이 정의한 다음 XDG 환경 변수들을 사용해요.

    • XDG_CONFIG_HOME
    • XDG_DATA_HOME
    • XDG_CACHE_HOME

터미널 기능

PowerShell 7.2부터 다음 환경 변수들로 출력에 색을 입히는 ANSI 이스케이프 시퀀스 같은 Virtual Terminal 기능을 제어할 수 있어요. ANSI 이스케이프 시퀀스 지원은 TERM이나 NO_COLOR 환경 변수로 끌 수 있어요.

  • TERM

    $Env:TERM의 값에 따라 동작이 다음과 같이 달라져요.

    • dumb$Host.UI.SupportsVirtualTerminal$false로 설정
    • xterm-mono$PSStyle.OutputRenderingPlainText로 설정
    • xterm$PSStyle.OutputRenderingPlainText로 설정
  • NO_COLOR

    $Env:NO_COLOR이 존재하면 $PSStyle.OutputRenderingPlainText로 설정돼요. NO_COLOR 환경 변수에 대한 자세한 내용은 https://no-color.org/ 를 참고해요.

더 알아보기