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-HostGet-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를 봐 주세요.

더 알아보기