PowerShell about_Special_Characters — 특수 문자 이스케이프 시퀀스

PowerShell about_Special_Characters — 특수 문자 이스케이프 시퀀스

PowerShell에서 특수 문자를 다루려면 백틱(`) 하나만 기억하면 돼요. 이 백틱이 붙은 시퀀스들이 어떤 문자를 만들어내는지, 그리고 파싱을 멈추게 하는 특별한 토큰들이 뭔지 하나씩 살펴볼게요. 코드는 그대로 실행하면 되니까 안심하고 따라 해보세요.

출처: about_Special_Characters - Microsoft Learn

본문

짧은 설명 (Short description)

PowerShell이 그다음에 오는 문자들을 어떤 식으로 해석할지를 제어하는 특수 문자 시퀀스에 대해 설명하는 문서예요.

자세한 설명 (Long description)

PowerShell에는 표준 문자 집합에 속하지 않는 문자들을 표현하기 위한 특수 문자 시퀀스가 마련되어 있어요. 이 시퀀스를 흔히 이스케이프 시퀀스(escape sequence)라고 불러요.

이스케이프 시퀀스는 백틱(backtick, `) 문자로 시작해요. 백틱은 묵음 액센트(grave accent)라고도 하고 ASCII 96번이에요. 그리고 이 시퀀스는 대소문자를 구분해요. 백틱은 이스케이프 문자(escape character)라고도 부르죠.

한가지 꼭 기억할 점이 있어요. 이스케이프 시퀀스는 큰따옴표(")로 묶인 문자열 안에서만 해석돼요. 작은따옴표 안에서는 백틱이 그냥 글자 그대로 취급되니 주의하세요.

PowerShell이 인식하는 이스케이프 시퀀스

시퀀스 설명
`0 Null
`a Alert(경보)
`b Backspace(백스페이스)
`e Escape(PowerShell 6에서 추가)
`f Form feed(용지 먹임)
`n New line(새 줄)
`r Carriage return(캐리지 리턴)
`t Horizontal tab(가로 탭)
`u{x} Unicode 이스케이프 시퀀스(PowerShell 6에서 추가)
`v Vertical tab(세로 탭)

PowerShell에는 또, 파싱을 어디에서 멈출지 지정하는 특별한 토큰도 있어요. 이 토큰 뒤에 오는 모든 문자는 해석되지 않고 리터럴 값으로 취급돼요.

특수 파싱 토큰(Special parsing tokens)

시퀀스 설명
-- 나머지 값들을 매개변수가 아닌 인수(argument)로 취급
--% 그 뒤의 모든 것을 파싱하지 않음
~ 틸드(Tilde)

Null (`0)

Null(`0) 문자는 PowerShell 출력에서 빈 공간처럼 보여요. 이 덕분에 문자열 종료나 레코드 종료 표시처럼 null 문자를 쓰는 텍스트 파일을 PowerShell로 읽고 처리할 수 있어요. 그런데 여기서 꼭 구분할 게 있어요. 이 특수 문자는 null 값(빈 값)을 저장하는 $null 변수와는 전혀 다른 존재예요.

Alert (`a)

Alert(`a) 문자는 컴퓨터 스피커로 경보음을 보내요. 사용자에게 곧 일어날 일을 미리 경고할 때 쓸 수 있죠. 다음 예제는 로컬 컴퓨터 스피커로 경보음을 두 번 보내요.

for ($i = 0; $i -le 1; $i++){"`a"}

Backspace (`b)

Backspace(`b) 문자는 커서를 한 칸 뒤로 옮겨요. 다만 어떤 문자도 지우지는 않아요. 아래 예제는 backup이라는 단어를 쓴 다음 커서를 두 번 뒤로 옮기고, 그 위치에서 공백 하나와 out이라는 단어를 이어서 써요.

"backup`b`b out"

결과는 이렇게 나와요.

back out

Escape (`e)

Note: 이 특수 문자는 PowerShell 6.0에서 추가됐어요.

Escape(`e) 문자는 주로 가상 터미널 시퀀스(ANSI 이스케이프 시퀀스) 를 지정할 때 써요. 텍스트 색상이나 굵게·밑줄 같은 텍스트 속성을 바꿀 수 있고, 커서 위치 이동이나 스크롤에도 쓰여요. 다만 PowerShell 호스트가 가상 터미널 시퀀스를 지원해야 동작해요. 지원 여부는 $Host.UI.SupportsVirtualTerminal의 부울 값으로 확인할 수 있어요.

ANSI 이스케이프 시퀀스에 대한 자세한 내용은 위키백과의 ANSI escape code 문서를 참고하세요.

다음 예제는 텍스트를 초록색 전경색으로 출력해요.

$fgColor = 32 # green
"`e[${fgColor}mGreen text`e[0m"
Green text

Form feed (`f)

Form feed(`f) 문자는 인쇄 명령이라서 현재 페이지를 내보내고 다음 페이지에서 계속 인쇄하게 해요. 그래서 이 문자는 인쇄된 문서에만 영향을 주고, 화면 출력에는 아무 영향을 주지 않아요.

New line (`n)

New line(`n) 문자는 그 문자 바로 뒤에서 줄바꿈을 삽입해요. 아래 예제는 Write-Host 명령에서 줄바꿈 문자를 써서 줄 바꿈을 만드는 방법을 보여줘요.

"There are two line breaks to create a blank line`n`nbetween the words."

줄바꿈이 두 번 들어가서 가운데 빈 줄이 생기는 걸 볼 수 있어요.

There are two line breaks to create a blank line

between the words.

Carriage return (`r)

Carriage return(`r) 문자는 출력 커서를 현재 줄의 맨 앞으로 옮기고 계속 이어서 써요. 그리고 그 줄에 있던 문자들은 전부 덮어써져요. 아래 예제에서 캐리지 리턴 앞의 텍스트가 덮어써져요.

Write-Host "These characters are overwritten.`rI want this text instead "

r 문자 앞의 텍스트가 지워지는 게 아니라 덮어써진다는 점만 확인하고 넘어갈게요.

I want this text instead written.

Horizontal tab (`t)

Horizontal tab(`t) 문자는 다음 탭 정지점(tab stop)으로 이동해서 그 지점부터 이어서 써요. 기본적으로 PowerShell 콘솔은 여덟 칸마다 탭 정지점이 있어요. 아래 예제는 각 열 사이에 탭을 두 번 넣어요.

"Column1`t`tColumn2`t`tColumn3"
Column1 Column2 Column3

Unicode 문자 (`u{x})

Note: 이 특수 문자는 PowerShell 6.0에서 추가됐어요.

Unicode 이스케이프 시퀀스(`u{x})를 쓰면 코드 포인트의 16진수 표현으로 어떤 Unicode 문자든지 지정할 수 있어요. 여기에는 기본 다국어 평면(BMP, 0xFFFF 이하)을 넘어선 문자도 포함돼요. 예를 들어 엄지척(u{1F44D}) 같은 이모지 문자가 그런 경우죠. 이 시퀀스는 **최소 한 자리, 최대 여섯 자리의 16진수**를 지원하고, 최대 16진수 값은 10FFFF`예요.

다음 예제는 위아래 화살표(↕) 기호를 출력해요.

"`u{2195}"

Vertical tab (`v)

Vertical tab(`v) 문자는 다음 세로 탭 정지점으로 이동해서 그 지점부터 나머지 출력을 써요. 다만 세로 탭이 실제로 어떻게 렌더링되는지는 기기와 터미널에 따라 달라져요.

Write-Host "There is a vertical tab`vbetween the words."

몇 가지 흔한 환경에서의 렌더링 결과를 보면 이래요.

  • Windows Console 호스트 애플리케이션은 (`v)를 특수 문자로 해석하되 여분의 공백은 넣지 않아요.
There is a vertical tab♂between the words.
  • **Windows Terminal**은 세로 탭 문자를 캐리지 리턴과 줄 바꿈으로 렌더링해요. 나머지 출력은 다음 줄의 맨 앞에서 출력돼요.
There is a vertical tab
between the words.
  • 프린터나 유닉스 기반 콘솔에서는 세로 탭 문자를 다음 줄로 이동해서 그 지점부터 나머지를 써요.
There is a vertical tab
between the words.

줄 이어쓰기 (Line continuation)

백틱 문자는 줄 끝에서도 쓰여요. 줄 끝에 백틱을 붙이면 PowerShell 파서가 "이 명령은 다음 줄에서 계속된다"고 해석해요. 자세한 내용은 about_Parsing을 참고하세요.

매개변수 종료 토큰 (--)

-- 토큰은 그 뒤에 오는 모든 인수를 큰따옴표로 감싼 것처럼 실제 그대로 전달하라는 뜻이에요. 예를 들어 --를 쓰면 -InputObject라는 문자열을 따옴표 없이도, 매개변수로 해석되지 않은 채로 출력할 수 있어요.

Write-Output -- -InputObject
-InputObject

이 규칙은 POSIX Shell and Utilities 명세에서 정의된 관례예요.

파싱 중지 토큰 (--%)

--% 토큰은 PowerShell이 문자열을 PowerShell 명령이나 식으로 해석하지 못하게 막아요. 그래서 그 문자열들을 다른 프로그램이 해석하도록 그대로 넘겨줄 수 있죠. 프로그램 이름 뒤, 그리고 오류를 일으킬 수 있는 프로그램 인수 앞에 이 토큰을 놓으면 돼요.

다음 예제는 Icacls 명령에서 파싱 중지 토큰을 사용해요.

icacls X:\VMS --% /grant Dom\HVAdmin:(CI)(OI)F

PowerShell은 이 문자열을 Icacls로 보내요.

X:\VMS /grant Dom\HVAdmin:(CI)(OI)F

두 번째 예제에서는 $HOME 변수를 cmd.exe /c echo 명령에 두 번 넘겨요.

cmd.exe /c echo $HOME --% $HOME

출력을 보면 첫 번째 $HOME은 PowerShell이 해석해서 변수 값이 cmd로 전달돼요. 두 번째 $HOME은 파싱 중지 토큰 뒤에 있으니 리터럴 문자열로 전달되죠.

C:\Users\username $HOME

파싱 중지 토큰에 대한 자세한 내용은 about_Parsing을 참고하세요.

Tilde (~)

틸드 문자(~)는 PowerShell에서 특별한 의미를 가져요. 경로의 시작 부분에서 PowerShell 명령과 함께 쓰이면 틸드를 사용자의 홈 디렉터리로 확장해줘요. 그런데 경로의 다른 위치에서 틸드를 쓰면 리터럴 문자로 취급돼요.

자세한 내용은 about_Parsing을 참고하세요.

더 알아보기