PowerShell

PowerShell is a task-based command-line shell and scripting language.

— MSDN 공식 문서

"명령어 하나 치는데 동사-명사 조합이 무슨 수필 마냥 길다. 손가락 관절염 걸리겠다." Get-ChildItem이라고 언제 다 치냐, 그냥 ls로 때우고 말지.1

1. 개요

마이크로소프트가 기존의 악명 높은 똥차 명령 프롬프트의 한계를 절감하고, 닷넷(.NET) 프레임워크 기반으로 야심 차게 설계한 차세대 명령 줄 인터페이스이자 객체지향 이다. 유닉스 계열의 셸들이 파이프라인(|)을 통해 '단순 텍스트 스트림'을 주고받는 반면, 파워셸은 진짜 살아 움직이는 구조화된 객체(Object)를 파이프라인으로 전송하는 혁명적인 아키텍처를 자랑한다. 과거에는 윈도우 서버 관리자들의 전유물이었으나, 오픈 소스 선언 및 크로스 플랫폼을 지원하는 파워셸 코어(PowerShell Core)의 등장으로 리눅스와 맥 OS에서도 굴러가는 기염을 토하게 되었다.

2. 동사-명사(Verb-Noun) 작명법과 가독성의 양날의 검

파워셸의 명령어는 철저하게 동사-명사의 쌍을 이루는 커맨들릿(Cmdlet) 구조로 이루어져 있다. 예를 들어 프로세스 목록을 가져오려면 Get-Process, 특정 서비스를 중지하려면 Stop-Service를 입력하는 식이다. 이 규격화 덕분에 처음 접하는 명령어도 쉽게 유추할 수 있다는 극강의 가독성을 자랑하지만, 반대로 말하면 타이핑이 지옥같이 길어진다는 악마의 단점이 존재한다.(...) 아무리 자동완성 탭이 있다 한들 간단한 리스팅 작업을 위해 Get-ChildItem을 일일이 타이핑하는 것은 상당한 고역이다. 마이크로소프트도 이를 아는지 lsdir 같은 유닉스/도스용 단축키(Alias)를 기본 매핑해두는 타협안을 마련해두었다.

3. 텍스트가 아닌 객체를 흘려보내는 파이프라인

파워셸의 참된 무서움은 파이프라인을 탈 때 발휘된다. 리눅스 배시에서는 특정 프로세스의 PID를 추출하기 위해 ps -ef | grep 'process_name' | awk '{print $2}' 처럼 기괴한 정규식과 텍스트 파싱 생쇼를 벌여야 한다. 하지만 파워셸은 출력 결과 자체가 구조화된 닷넷 클래스의 인스턴스이므로, Get-Process -Name 'process_name' | Select-Object -Property Id 한 줄로 완벽하고 안전하게 원하는 데이터를 뽑아낼 수 있다. 정규식 튜닝 과정에서 오는 스트레스를 제로에 수렴하게 만든다는 점에서, 데이터 바인딩과 객체지향 지지자들의 엄청난 찬사를 받는다.2

4. 관련 밈 및 드립

4.1. 파란 화면의 공포 (Blue Screen of CLI)

처음 파워셸을 실행하면 마주하는 진한 파란색 바탕의 기본 배경색이 윈도우의 악명 높은 사망 선고인 '블루스크린'을 연상케 해 입문자들에게 묘한 긴장감과 불쾌한 골짜기를 선사한다는 밈이다. 실제로 백엔드 개발자나 시스템 엔지니어가 작업 도중 급하게 파워셸을 띄울 때 순간적으로 가슴이 철렁 내려앉았다는 증언이 속출한다. 이 때문에 파워셸을 켜자마자 배경색을 검은색으로 바꾸는 것이 일종의 국룰로 통한다.(...)

4.2. ls는 되는데 ls가 아니다

리눅스에 절여진 개발자들을 끌어들이기 위해 마이크로소프트는 파워셸에 ls, cat, rm, ps 같은 유닉스 명령어 단축어(Alias)를 기본으로 심어두었다. 하지만 기분 좋게 ls를 쳤다가 리턴된 결과물이 단순 텍스트가 아니라 닷넷의 System.IO.DirectoryInfo 객체 리스트임을 깨닫는 순간 뒤통수가 얼얼해진다. 리눅스 환경과 동일하게 동작할 것이라 믿고 쉘 스크립트에 리눅스 문법을 섞어 썼다가 고장 나는 참사가 발생하며, 결국 '이럴 거면 걍 WSL 쓰련다'라며 도망치는 엔지니어들의 단골 레퍼토리다.

5. 여담

  • 원래 이름은 모나드(Monad): 프로젝트 초기의 코드네임은 철학 및 수학 용어인 '모나드'였다. 개발자 제프리 스노버(Jeffrey Snover)는 파워셸을 설계했다가 마이크로소프트 내에서 이단아 취급을 받으며 직급 강등까지 당했으나, 결국 그 가치를 인정받아 MS 기술 펠로우 자리에까지 올랐다.
  • 엄격한 실행 정책(Execution Policy): 보안을 위해 기본적으로 스크립트 실행이 전면 차단되어 있다(Restricted). 처음 파워셸로 빌드 스크립트를 돌려보려는 신입들이 반드시 겪는 통곡의 벽으로, 구글Set-ExecutionPolicy RemoteSigned를 검색해 복사 붙여넣기를 실행함으로써 비로소 문명이 시작된다.3
  • 리눅스로의 진출: 닷넷 코어(.NET Core)가 멀티 플랫폼을 지원하면서 파워셸도 리눅스에 공식 패키지로 릴리즈되었다. 실제로 써보면 생각보다 닷넷 기반 리눅스 모니터링 툴로써의 강력함을 뽐내지만, 정작 유행처럼 번지지는 않았다.

6. 관련 문서

각주

  1. 이를 극복하기 위해 ls, cp, mv, cat 같은 리눅스/유닉스 단축키를 대거 앨리어스(Alias)로 미리 정의해 두었다.

  2. 특히 파이프라인으로 매칭되는 객체의 구조를 파악하기 위해 Get-Member 명령어(줄여서 gm)를 주야장천 때려야만 프로그래밍이 가능하다.

  3. 이 엄격한 보안 정책 덕분에 과거 윈도우 배치 파일(.bat)을 통한 악성코드 유포 경로가 상당히 까다로워졌다. 물론 악성코드 제작자들은 bypass 옵션으로 다 우회해서 쓴다.(...)