PowerShell 프로필 — about_Profiles
PowerShell 프로필 — about_Profiles
터미널을 켤 때마다 좋아하는 별칭(alias)이나 함수, 변수를 매번 다시 만들고 있나요? 그런 반복을 없애 주는 게 바로 프로필(profile)이에요. PowerShell 공식 도움말 about_Profiles를 차근차근 풀어서, 프로필이 무엇인지, 어디에 만들어 두는지, 그리고 직접 만들고 쓰는 방법까지 함께 살펴볼게요.
출처: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_profiles
프로필이 뭐예요? (Short description)
간단히 말하면, PowerShell 프로필은 PowerShell이 시작될 때 함께 실행되는 스크립트예요. 이 스크립트가 자동으로 실행되면서 매 세션마다 환경이 미리 준비되죠.
본문
자세한 설명 (Long description)
프로필을 활용하면 내 환경을 직접 꾸미고, 앞으로 열 모든 세션에 공통으로 쓰고 싶은 요소를 미리 담아 둘 수 있어요. 시작 스크립트로 생각하면 이해하기 쉬워요. 여기에 명령어, 별칭, 함수, 변수, 모듈, PowerShell 드라이브 등은 물론이고, 세션마다 다시 import 하거나 만들 필요 없이 항상 준비되길 바라는 요소를 자유롭게 추가할 수 있어요.
PowerShell은 사용자와 호스트 프로그램에 따라 여러 개의 프로필을 지원하지만, 프로필 파일을 대신 만들어 주지는 않아요. 준비는 늘 우리 몫이라는 점만 기억해 두면 돼요.
프로필 종류와 위치 (Profile types and locations)
PowerShell은 사용자와 호스트(host)에 따라 나뉘는 여러 프로필 파일을 지원해요. 이 파일들을 컴퓨터에 필요한 만큼, 아무 조합으로나 둘 수 있어요. 기본 콘솔에서 쓰는 기본 프로필 파일은 다음과 같아요. 아래 경로가 기본 위치랍니다.
| 범위 | Windows | Linux | macOS |
|---|---|---|---|
| All Users, All Hosts | $PSHOME\Profile.ps1 |
/opt/microsoft/powershell/7/profile.ps1 |
/usr/local/microsoft/powershell/7/profile.ps1 |
| All Users, Current Host | $PSHOME\Microsoft.PowerShell_profile.ps1 |
/opt/microsoft/powershell/7/Microsoft.PowerShell_profile.ps1 |
/usr/local/microsoft/powershell/7/Microsoft.PowerShell_profile.ps1 |
| Current User, All Hosts | $HOME\Documents\PowerShell\Profile.ps1 |
~/.config/powershell/profile.ps1 |
~/.config/powershell/profile.ps1 |
| Current User, Current Host | $HOME\Documents\PowerShell\Microsoft.PowerShell_profile.ps1 |
~/.config/powershell/Microsoft.PowerShell_profile.ps1 |
~/.config/powershell/Microsoft.PowerShell_profile.ps1 |
프로필 스크립트는 위에 나열된 순서대로 실행돼요. 그러니까 앞선 프로필(All Users, All Hosts)에서 바꾼 내용을 나중에 실행되는 프로필이 덮어쓸 수 있죠. CurrentUserCurrentHost 프로필은 항상 마지막에 실행되어요. PowerShell 도움말에서는 바로 이 프로필을 흔히 내 PowerShell 프로필이라고 부르는 경우가 많아요.
PowerShell을 호스트하는 다른 프로그램들도 자기만의 프로필을 지원할 수 있어요. 예를 들어 Visual Studio Code(VS Code)는 다음과 같은 호스트 전용 프로필을 지원해요.
- All users, Current Host -
$PSHOME\Microsoft.VSCode_profile.ps1 - Current user, Current Host -
$HOME\Documents\PowerShell\Microsoft.VSCode_profile.ps1
프로필 경로에는 다음 변수가 들어 있어요.
$PSHOME변수는 PowerShell 설치 디렉터리를 담아요.$HOME변수는 현재 사용자의 홈 디렉터리를 담아요.
참고 — Windows에서
Documents폴더는 폴더 리디렉션(folder redirection)이나 OneDrive 때문에 위치가 바뀔 수 있어요. 그런데Documents폴더를 네트워크 공유로 리디렉션하거나 OneDrive에 포함시키는 건 권장하지 않아요. 폴더 위치가 바뀌면 모듈이 로드에 실패하거나 프로필 스크립트에 오류가 생길 수 있거든요. OneDrive 관리에서Documents폴더를 제거하는 방법은 OneDrive 문서를 참고해 주세요.
$PROFILE 변수 (The $PROFILE variable)
$PROFILE 자동 변수는 현재 세션에서 사용할 수 있는 프로필들의 경로를 담아요. 이 변수 값을 출력하면 프로필 경로를 확인할 수 있고, 명령어에서 경로를 나타낼 때도 그대로 쓸 수 있어요.
$PROFILE 변수는 "Current User, Current Host" 프로필의 경로를 담아요. 나머지 프로필들은 $PROFILE 변수의 메모(속성) 형태로 저장되어 있어요. 예를 들어 Windows PowerShell 콘솔에서는 $PROFILE 변수가 다음과 같은 값들을 가져요.
- Current User, Current Host -
$PROFILE - Current User, Current Host -
$PROFILE.CurrentUserCurrentHost - Current User, All Hosts -
$PROFILE.CurrentUserAllHosts - All Users, Current Host -
$PROFILE.AllUsersCurrentHost - All Users, All Hosts -
$PROFILE.AllUsersAllHosts
$PROFILE 변수의 값은 사용자마다, 또 호스트 프로그램마다 달라져요. 그래서 사용하는 각각의 PowerShell 호스트에서 프로필 변수 값을 직접 확인해 보는 게 좋아요. 현재 값을 확인하려면 이렇게 입력해요.
$PROFILE | Select-Object *
$PROFILE 변수는 여러 명령어에서 유용하게 써요. 예를 들어 아래 명령은 "Current User, Current Host" 프로필을 메모장(Notepad)에서 열어줘요.
notepad $PROFILE
다음 명령은 "All Users, All Hosts" 프로필이 로컬 컴퓨터에 만들어져 있는지 확인해요.
Test-Path -Path $PROFILE.AllUsersAllHosts
프로필 만들기 (How to create a profile)
프로필을 만들 때는 다음 형식의 명령을 사용해요.
if (!(Test-Path -Path <profile-name>)) {
New-Item -ItemType File -Path <profile-name> -Force
}
예를 들어 현재 PowerShell 호스트에서 현재 사용자의 프로필을 만들고 싶다면 이렇게 해요.
if (!(Test-Path -Path $PROFILE)) {
New-Item -ItemType File -Path $PROFILE -Force
}
이 명령에서 if 문이 기존 프로필을 덮어쓰지 않게 막아줘요. 만들고 싶은 프로필의 경로에 맞춰 $PROFILE 변수 값을 바꿔 쓰면 돼요.
참고 — Windows Vista 이후 버전에서 "All Users" 프로필을 만들려면 PowerShell을 관리자 권한으로 실행(Run as administrator) 해야 해요.
프로필 편집하기 (How to edit a profile)
프로필 파일은 메모장 같은 텍스트 편집기로 열 수 있어요. 현재 호스트에서 현재 사용자의 프로필을 메모장으로 열려면 이렇게 입력하세요.
notepad $PROFILE
다른 프로필을 열려면 프로필 이름을 지정하면 돼요. 예를 들어 모든 호스트 애플리케이션의 모든 사용자에 적용되는 프로필을 열려면 이렇게 해요.
notepad $PROFILE.AllUsersAllHosts
변경 사항을 적용하려면 프로필 파일을 저장한 뒤 PowerShell을 다시 시작하면 돼요.
프로필 고르기 (How to choose a profile)
여러 호스트 애플리케이션을 사용한다면, 모든 호스트에서 공통으로 쓰는 항목은 $PROFILE.CurrentUserAllHosts 프로필에 넣어요. 반대로 어떤 호스트에만 해당하는 항목, 예를 들어 특정 호스트의 배경색을 정하는 명령 같은 건 그 호스트 전용 프로필에 넣는 게 좋아요.
관리자로서 많은 사용자의 PowerShell을 커스터마이징한다면 이런 기준을 따르세요.
- 공통 항목은
$PROFILE.AllUsersAllHosts프로필에 저장해요. - 호스트 애플리케이션 전용 항목은 해당 호스트의
$PROFILE.AllUsersCurrentHost프로필에 저장해요. - 특정 사용자만을 위한 항목은 그 사용자 전용 프로필에 저장해요.
호스트 애플리케이션이 PowerShell 프로필을 특별한 방식으로 구현하고 있다면, 반드시 해당 호스트 문서를 확인해 보는 게 좋아요.
프로필 활용하기 (How to use a profile)
PowerShell에서 만드는 많은 항목과 실행하는 대부분의 명령은 현재 세션에만 영향을 줘요. 세션이 끝나면 그 항목들은 사라져요. 세션 전용으로 남는 것들에는 PowerShell 변수, 환경 변수, 별칭, 함수, 명령, 그리고 세션에 추가한 PowerShell 모듈이 포함돼요.
이 항목들을 저장해서 앞으로 모든 세션에서 쓰고 싶다면 프로필에 추가하면 돼요. 프로필의 또 다른 흔한 용도는 자주 쓰는 함수·별칭·변수를 저장해 두는 거예요. 프로필에 저장해 두면 어떤 세션이든 필요할 때 다시 만들지 않고 바로 쓸 수 있어요.
프로필 시작하기 (How to start a profile)
빈 프로필 파일을 열어 보면 아무것도 없을 거예요. 여기에 자주 쓰는 변수와 별칭, 명령을 채워 넣으면 됩니다. 시작을 도와줄 몇 가지 예시를 소개할게요.
임의의 cmdlet에 대한 별칭을 나열하는 함수 추가 (Add a function that lists aliases for any cmdlet)
function Get-CmdletAlias ($cmdletName) {
Get-Alias |
Where-Object -FilterScript {$_.Definition -like "$cmdletName"} |
Format-Table -Property Definition, Name -AutoSize
}
콘솔 커스터마이즈 (Customize your console)
function CustomizeConsole {
$hostTime = (Get-ChildItem -Path $PSHOME\pwsh.exe).CreationTime
$hostVersion="$($Host.Version.Major)`.$($Host.Version.Minor)"
$Host.UI.RawUI.WindowTitle = "PowerShell $hostVersion ($hostTime)"
Clear-Host
}
CustomizeConsole
커스터마이즈된 PowerShell 프롬프트 추가 (Add a customized PowerShell prompt)
function prompt {
$Env:COMPUTERNAME + "\" + (Get-Location) + "> "
}
PowerShell 프롬프트에 대한 자세한 내용은 about_Prompts를 참고해 주세요. 다른 프로필 예시는 Customizing your shell environment에서 확인할 수 있어요.
NoProfile 매개 변수 (The NoProfile parameter)
프로필 없이 PowerShell을 시작하려면, PowerShell을 시작하는 프로그램인 pwsh.exe의 NoProfile 매개 변수를 사용해요. 먼저 Cmd.exe나 PowerShell 자체처럼 PowerShell을 시작할 수 있는 프로그램을 열어요. Windows의 실행(Run) 대화 상자를 써도 돼요. 그리고 이렇게 입력하세요.
pwsh -NoProfile
pwsh.exe의 전체 매개 변수 목록을 보려면 이렇게 입력해요.
pwsh -?
프로필과 실행 정책 (Profiles and execution policy)
PowerShell 실행 정책은 스크립트와 구성 파일(프로필 포함)을 실행할 수 있는지 여부를 일부 결정해요. 기본값은 Restricted 실행 정책인데, 이 정책은 프로필을 포함한 모든 스크립트의 실행을 막아요. "Restricted" 정책을 쓰면 프로필이 실행되지 않고, 그 내용도 적용되지 않아요.
Set-ExecutionPolicy 명령이 실행 정책을 설정하고 변경해요. 이 명령은 값이 레지스트리에 저장되기 때문에 모든 PowerShell 세션에 적용되는 몇 안 되는 명령 중 하나예요. 콘솔을 열 때마다 설정할 필요도, 프로필에 Set-ExecutionPolicy 명령을 저장해 둘 필요도 없어요.
프로필과 원격 세션 (Profiles and remote sessions)
원격 세션에서는 PowerShell 프로필이 자동으로 실행되지 않아요. 그래서 프로필이 추가하는 명령들이 원격 세션에 없어요. 게다가 원격 세션에서는 $PROFILE 자동 변수도 채워지지 않아요. 세션에서 프로필을 실행하려면 Invoke-Command cmdlet을 사용해요.
예를 들어 다음 명령은 $s 세션에서 로컬 컴퓨터의 "Current user, Current Host" 프로필을 실행해요.
Invoke-Command -Session $s -FilePath $PROFILE
다음 명령은 $s 세션에서 원격 컴퓨터의 "Current user, Current Host" 프로필을 실행해요. $PROFILE 변수가 채워지지 않으므로 프로필의 명시적 경로를 사용해요. 점 소싱(dot sourcing) 연산자를 사용해서 프로필이 원격 컴퓨터에서 자기만의 스코프가 아니라 현재 스코프에서 실행되도록 한 점이 포인트예요.
Invoke-Command -Session $s -ScriptBlock {
. "$HOME\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1"
}
이 명령을 실행하면 프로필이 세션에 추가하는 명령들이 $s에서 사용 가능해져요.
MSIX 기반 설치에서의 프로필 (Profiles for MSIX-based installations)
MSIX 기반 PowerShell 설치에서는 AllUsersAllHosts와 AllUsersCurrentHost 프로필 스크립트가 반드시 $PSHOME 디렉터리에 있어야 해요. 그런데 MSIX 패키지는 읽기 전용 위치에 설치되기 때문에 $PSHOME에 프로필 스크립트를 만들거나 수정할 수 없어요. 그 결과 MSIX 기반 설치에서는 이 모든 사용자용(all-users) 프로필을 통한 사용자 커스터마이징을 지원하지 않고, CurrentUserAllHosts와 CurrentUserCurrentHost 프로필만 만들고 사용할 수 있어요.