2010년의 단축키 글은 Windows 콘솔 창(conhost)의 기능을 정리한 것이었다. F7로 기록 창을 띄우고 F8로 찾는 식이었다. 지금 줄 편집은 PSReadLine이라는 모듈이 맡고, PowerShell 7에 들어 있다. 어느 터미널에서나 같게 동작한다.
자주 쓰는 키
| 키 | 하는 일 |
|---|---|
Tab | 자동 완성. 명령, 매개변수, 경로, 속성 이름까지 |
Ctrl+r | 기록을 거꾸로 찾기. 몇 글자 치면 맞는 명령이 나온다 |
Alt+. | 앞 명령의 마지막 인자를 붙여 넣기 |
F1 | 커서가 있는 명령의 도움말 |
Alt+h | 커서가 있는 매개변수의 설명 |
F2 | 예측을 한 줄로 볼지 목록으로 볼지 바꾸기 |
Ctrl+l | 화면 지우기 |
키 배치는 운영체제마다 기본값이 다르다. Windows는 Windows 모드, 리눅스와 macOS는 Emacs 모드가 기본이다. 위의 표는 두 모드에 공통인 것만 골랐다. 지금 내 콘솔에 걸려 있는 키는 이렇게 본다.
Get-PSReadLineKeyHandler -Bound
Windows 모드에는 Ctrl+Space(가능한 완성을 목록으로 펼치기)가 더 있다. Emacs 모드에서도 같은 것을 원하면 프로필에 한 줄 넣는다.
Set-PSReadLineKeyHandler -Chord 'Ctrl+Spacebar' -Function MenuComplete
예측 입력
명령을 치기 시작하면 기록에서 맞는 것을 찾아 흐린 글씨로 이어 보여 준다. 오른쪽 화살표로 받아들인다.
F2를 누르거나 설정을 바꾸면 후보를 목록으로 본다. 한 줄만 보여 주는 것보다 고르기 쉽다.
Set-PSReadLineOption -PredictionViewStyle ListView
예측의 출처는 기록과 플러그인이다. Azure 모듈처럼 예측 플러그인을 주는 모듈도 있다.
Get-PSReadLineOption | Select-Object EditMode, PredictionSource, PredictionViewStyle
기록
기록은 세션이 끝나도 남는다. 파일 하나에 쌓이고, 그 경로는 설정에 있다.
(Get-PSReadLineOption).HistorySavePath
기록 파일에는 친 것이 그대로 남는다. 명령줄에 암호나 토큰을 적으면 이 파일에 평문으로 들어간다. PSReadLine이 password, token 같은 낱말이 든 줄을 걸러 주기는 하지만 믿을 만한 방어는 아니다. 비밀은 명령줄에 적지 않고 Get-Credential이나 Get-Secret으로 넣는다.
이번 세션의 기록만 볼 때는 Get-History를, 번호로 다시 실행할 때는 Invoke-History를 쓴다.
프롬프트 바꾸기
프롬프트는 prompt라는 이름의 함수가 돌려주는 글자다. 기본 정의를 보면 이렇다.
(Get-Command prompt).Definition
"PS $($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) ";
같은 이름으로 함수를 만들면 내 프롬프트가 된다. 사용자 이름을 초록색으로, 경로는 마지막 폴더만 보이게 해 본다.
function prompt {
"$($PSStyle.Foreground.Green)$env:USER$($PSStyle.Reset) $(Split-Path -Leaf (Get-Location))> "
}
Windows에서는 $env:USER 대신 $env:USERNAME을 쓴다. 계속 쓰려면 이 함수를 프로필에 넣는다.
git 브랜치나 명령 실행 시간까지 넣은 화려한 프롬프트를 원하면 직접 짜기보다 Oh My Posh나 Starship 같은 도구를 쓰는 편이 낫다. 다만 프롬프트는 명령을 칠 때마다 실행된다. 무거운 프롬프트는 콘솔 전체를 굼뜨게 만든다.
색: $PSStyle
2010년에는 색을 Write-Host -ForegroundColor로만 입혔다. 지금은 $PSStyle로 글자 안에 색과 굵기를 넣는다. 결과는 보통의 문자열이라 프롬프트, 표, 기록 어디에나 쓸 수 있다.
"$($PSStyle.Foreground.Red)실패$($PSStyle.Reset) 3건, $($PSStyle.Bold)전체$($PSStyle.Reset) 120건"
파일로 보내거나 다른 프로그램에 넘길 때 색 코드가 섞이지 않게 하려면 출력 방식을 정한다.
$PSStyle.OutputRendering = 'Host' # 화면에만 색 (기본)
$PSStyle.OutputRendering = 'PlainText' # 색 없음
창 크기에 대해
2010년에 $Host.UI.RawUI.WindowSize로 창 크기를 바꾸는 글을 썼다. 옛 콘솔 창에서만 통하던 방법이다. Windows Terminal을 비롯한 요즘 터미널에서 창 크기, 글꼴, 색 구성은 터미널의 설정이 맡는다. PowerShell 쪽에서 볼 일이 있는 것은 현재 폭 정도다.
$Host.UI.RawUI.WindowSize.Width
맺으며
열한 편으로 2010년의 연재를 다시 썼다. 다시 쓰면서 가장 크게 느낀 것은, 그때 손으로 메우던 틈을 지금은 언어와 기본 명령이 메우고 있다는 점이다. 임시 파일을 거치던 것은 파이프라인이, .NET 클래스를 직접 만들던 것은 명령 하나가, 차례로 기다리던 것은 -Parallel이 대신한다.
그래도 바뀌지 않은 것이 있다. 개체가 파이프라인을 흐른다는 것, 모르는 것은 Get-Command, Get-Help, Get-Member에게 묻는다는 것. 1편에서 시작한 그 셋이면 나머지는 찾아 쓸 수 있다.