about_Prompts — PowerShell 프롬프트 함수
about_Prompts — PowerShell 프롬프트 함수
PowerShell의
prompt함수가 무엇인지, 그리고 원하는 모양으로 직접 만들어 쓰는 법을 하나씩 설명해 드릴게요. 출처: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_prompts
본문
짧게 요약하면
prompt 함수를 설명하고, 커스텀 prompt 함수를 어떻게 만드는지 보여드릴게요.
본격적으로 알아보기
PowerShell 명령 프롬프트는 PowerShell이 명령을 실행할 준비가 됐다는 뜻이에요:
PS C:\>
PowerShell에는 기본 제공되는 prompt 함수가 있고, 프로필 스크립트에 나만의 prompt 함수를 정의해서 바꿀 수 있어요.
prompt 함수는 어떻게 생겼나요
prompt 함수는 PowerShell 프롬프트의 모양을 결정해요. 기본 prompt 함수가 함께 제공되지만, 직접 prompt 함수를 정의하면 덮어쓸 수 있어요.
prompt 함수의 문법은 다음과 같아요:
function prompt { <function-body> }
prompt 함수는 객체를 반환해야 해요. 문자열이나 문자열로 형식화된 객체를 반환하는 게 좋은 습관이고요, 권장하는 최대 길이는 80자예요.
예를 들어, 아래 prompt 함수는 "Hello, World" 문자열 다음에 오른쪽 꺾쇠(>)를 붙여 반환해요.
PS C:\> function prompt {"Hello, World > "} Hello, World >
prompt 함수 가져오기
prompt 함수를 가져오려면 Get-Command cmdlet을 쓰거나, Function 드라이브에서 Get-Item cmdlet을 쓰면 돼요.
예를 들어:
PS C:\> Get-Command prompt CommandType Name ModuleName ----------- ---- ---------- Function prompt
prompt 값을 설정하는 스크립트를 보려면, 점 표기법으로 prompt 함수의 ScriptBlock 속성을 가져와요.
예를 들어:
(Get-Command prompt).ScriptBlock
"PS $($ExecutionContext.SessionState.Path.CurrentLocation)$('>' * ($NestedPromptLevel + 1)) " # .Link # https://go.microsoft.com/fwlink/?LinkID=225750 # .ExternalHelp System.Management.Automation.dll-help.xml
다른 함수와 마찬가지로 prompt 함수는 Function: 드라이브에 저장돼 있어요. 현재 prompt 함수를 만드는 스크립트를 화면에 표시하려면 이렇게 입력하세요:
(Get-Item Function:prompt).ScriptBlock
기본 프롬프트
기본 프롬프트는 prompt 함수가 오류를 만들거나 객체를 반환하지 않을 때만 나타나요.
기본 PowerShell 프롬프트는 다음과 같아요:
PS>
예를 들어, 아래 명령은 prompt 함수를 $null로 설정하는데요, 이건 잘못된 값이라 결과적으로 기본 프롬프트가 나타나요.
PS C:\> function prompt {$null} PS>
PowerShell에는 기본 제공 프롬프트가 있기 때문에, 보통은 기본 프롬프트를 거의 보지 못해요.
기본 제공 프롬프트
PowerShell에는 기본 제공되는 prompt 함수가 들어 있어요.
function prompt { "PS $($ExecutionContext.SessionState.Path.CurrentLocation)$('>' * ($NestedPromptLevel + 1)) "; # .Link # https://go.microsoft.com/fwlink/?LinkID=225750 # .ExternalHelp System.Management.Automation.dll-help.xml }
이 함수는 Test-Path cmdlet으로 $PSDebugContext 자동 변수에 값이 있는지 검사해요. 값이 있으면 디버깅 모드에서 실행 중이라는 뜻이라, 프롬프트에 [DBG]:가 붙어요. 이렇게요:
[DBG]: PS C:\ps-test>
$PSDebugContext가 채워지지 않았다면 함수는 PS만 프롬프트에 붙여요. 그다음 Get-Location cmdlet으로 현재 파일 시스템 디렉터리 위치를 구하고, 오른쪽 꺾쇠(>)를 붙이죠.
예를 들어:
PS C:\ps-test>
중첩 프롬프트(nested prompt) 상태라면 함수는 꺾쇠 두 개(>>)를 붙여요. $NestedPromptLevel 자동 변수 값이 0보다 크면 중첩 프롬프트 안에 있는 거예요.
예를 들어, 중첩 프롬프트에서 디버깅 중이면 프롬프트는 다음과 비슷하게 보여요:
[DBG] PS C:\ps-test>>>
프롬프트 변화
Enter-PSSession cmdlet은 원격 컴퓨터 이름을 현재 prompt 함수 앞에 붙여요. Enter-PSSession cmdlet으로 원격 컴퓨터와 세션을 시작하면 명령 프롬프트에 원격 컴퓨터 이름이 포함되도록 바뀌죠. 예를 들어:
PS Hello, World> Enter-PSSession Server01 [Server01]: PS Hello, World>
다른 PowerShell 호스트 응용 프로그램이나 대체 셸은 각자만의 커스텀 명령 프롬프트를 가질 수 있어요.
$PSDebugContext와 $NestedPromptLevel 자동 변수에 대해 더 자세히 알고 싶다면 about_Automatic_Variables를 봐 주세요.
프롬프트를 어떻게 바꾸나요
프롬프트를 바꾸려면 새 prompt 함수를 작성하면 돼요. 이 함수는 보호되지 않아서 자유롭게 덮어쓸 수 있어요.
prompt 함수를 작성하려면 다음과 같이 입력하세요:
function prompt { }
그다음 중괄호 사이에 프롬프트를 만드는 명령이나 문자열을 넣으면 돼요.
예를 들어, 아래 프롬프트는 컴퓨터 이름을 포함해요:
function prompt {"PS [$Env:COMPUTERNAME]> "}
Server01 컴퓨터에서는 프롬프트가 다음과 비슷하게 보여요:
PS [Server01] >
다음 prompt 함수는 현재 날짜와 시간을 포함해요:
function prompt {"$(Get-Date)> "}
그 프롬프트는 다음과 비슷하게 보여요:
03/15/2012 17:49:47>
기본 prompt 함수를 바꿀 수도 있어요.
예를 들어, 아래처럼 수정한 prompt 함수는 관리자 권한으로 실행되는 세션에서 기본 PowerShell 프롬프트에 [ADMIN]:을 붙여줘요.
function prompt { $identity = [Security.Principal.WindowsIdentity]::GetCurrent() $principal = [Security.Principal.WindowsPrincipal] $identity $adminRole = [Security.Principal.WindowsBuiltInRole]::Administrator $(if (Test-Path Variable:/PSDebugContext) { '[DBG]: ' } elseif($principal.IsInRole($adminRole)) { "[ADMIN]: " } else { '' } ) + 'PS ' + $(Get-Location) + $(if ($NestedPromptLevel -ge 1) { '>>' }) + '> ' }
관리자 권한으로 실행 옵션으로 PowerShell을 시작하면 다음과 비슷한 프롬프트가 나타나요:
[ADMIN]: PS C:\ps-test>
다음 prompt 함수는 다음에 실행할 명령의 기록 ID(history ID)를 표시해요. 명령 기록을 보려면 Get-History cmdlet을 쓰면 돼요.
function prompt { # The at sign creates an array in case only one history item exists. $history = @(Get-History) if($history.Count -gt 0) { $lastItem = $history[$history.Count - 1] $lastId = $lastItem.Id } $nextCommand = $lastId + 1 $currentDirectory = Get-Location "PS: $nextCommand $currentDirectory >" }
다음 프롬프트는 Write-Host와 Get-Random cmdlet으로 색이 무작위로 바뀌는 프롬프트를 만들어요. Write-Host는 현재 호스트 응용 프로그램에 쓸 뿐 객체를 반환하지 않기 때문에, 이 함수에는 return 문이 포함돼 있어요. 이게 없으면 기본 프롬프트 PS>가 사용돼요.
function prompt { $color = Get-Random -Min 1 -Max 16 Write-Host ("PS " + $(Get-Location) +">") -NoNewline ` -ForegroundColor $Color return " " }
prompt 함수 저장하기
다른 함수와 마찬가지로 prompt 함수도 현재 세션에서만 존재해요. 나중 세션에서도 쓰려면 PowerShell 프로필에 추가하면 돼요. 프로필에 대해 더 자세히 알고 싶다면 about_Profiles를 봐 주세요.