PowerShell은 Perl과 비슷하다?

MS의 PowerShell은 UNIX의 쉘에 비해서 떨어지는 윈도우즈의 쉘환경을 개선하기 위해 MS에서 새로만든 .NET기반의 shell이다. PowerShell은 현재는 별도로 설치해야 사용할 수 있으나 근래에 출시된 Windows 2008부터는 포함되어 배포된다.

어쨌든 PowerShell은 배치파일과,VBScript의 다음을 잇는 MS의 주력 쉘이 될 것이고 관련 서적들도 많이 나오고 있다. PowerShell은 Cmdlet이라는 것과 .NET객체들과 결합해서 손쉽게 윈도우 운영체제 내부의 정보에 접근해서 다룰 수 있는 이점이 있으며

<예 - 프로세스들에서 워킹셋(Working Set)이 20MB 이상인 것 표시>

Get-Process | Where-Object { $_.WS -ge 20MB }

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    270      14    18776      34160    92    13.69   4792 AcroRd32
   4350      68   771580     701472  1150 6,778.64   4248 firefox

일반적인 문법을 보면 unix 쉘과 Perl의 중간쯤 문법이라는 느낌이다. 일단 Perl과 비슷한 점을 몇 가지를 들어보면 다음과 같다.

* 변수에 sigil을 사용
<powershell>
$var =1
$array = @(1,2,3)
$hash = @{a=1;b=2;c=3}

<perl>
$var=1;
@array = (1,2,3);
%hash = (a=>1, b=>2, c=>3);

$var 처럼 $를 붙이는 sigil을 사용한다는 점이 Perl과 비슷하나 Perl과는 달리 무조건 $을 쓴다.  이것은 sigil로 변수의 내용을 유추할 수 있는 Perl이 훨씬 진보된 방식이다.

*슬라이스(slice) 문법
<powershell>
(1,2,3,"test")[0,2]

<perl>
(1,2,3,"test")[0,2];

*범위연산자
<powershell>
$array = 1..5

<perl>
@array = 1..5;

* $_ 기본변수
<powershell>
1,2,3 | foreach { Write-host $_ }

<perl>
foreach (1,2,3) { print $_,"\n" }

* 보간(interpolation)
<powershell>
"var is $var. ${var}th"

<perl>
"var is $var. ${var}th"


* 익명함수 선언과 호출
<powershell>
$func = { return $args[0]*2 }
&$func(2)

<perl>
$func = sub { return $_[0]*2 };
&$func(2)
$func->(2)

이외에도 PowerShell을 살펴보면 Perl과 비슷한 점이 많다. PowerShell은 일반적 범용 프로그래밍 언어가 아니라 시스템관리 같은 한정된 특정도메인에 맞게 설계된 언어라고 하지만, 대충 훑어보니 끼워 맞춘듯한 문법 같은 것들과 문법의 모호성 같은 것이 느껴졌다. 일례로 배열을 선언할 때

$a=1,2,3
$a=(1,2,3)
$a=@(1,2,3)
$a=$(1,2,3)

가 다 같은 결과이며 변수와 리터럴의 구분이 모호하다. 그리고 hash자료구조에서

$hash=@{a=1;b=2;c=3}

라는 해시를 선언했으면 해시키 a에 대한 값(1)은 $hash['a'] 혹은 $hash.a 로 얻을 수 있다.
그리고 $hash내의 key,value쌍 갯수를 얻으려면 $hash.Count 키들의 목록을 얻으려면 $hash.Keys 값들의 목록을 얻으려면 $hash.Values 의 빌트인 함수를 사용할 수 있다. 위 해시에 이것들을 적용하면
$hash.Count 는 3
$hash.Keys 는 a b c
$hash.Values 는 1 2 3
이 된다.

그러면 해시를 다음과 같이 선언하고 $hash의 Count,Keys,Values를 보기위해 똑같이 해보자

PS D:\temp> $hash=@{a=1;b=2;c=3;Count=0;Keys=0;Values=0}
PS D:\temp> $hash.Count
0
PS D:\temp> $hash.Keys
0
PS D:\temp> $hash.Values
0

이런 해시의 경우 Count, Keys, Values가 Key가 빌트인 함수로 해석되지 않고 key로 해석되며 문제는 Count,Keys,Values 빌트인 함수를 호출할 방법조차 없어진다는 것이다.

그리고 PowerShell의 성능도 아직까진 그렇게 좋은 것 같지 않다. 어떤 사람이 IIS로그들 중에 필요한 부분을 정규식을 통해 뽑아내는 프로그램을 Perl과 PowerShell로 짜서 돌려봤는데 ( http://bohdanszymanik.blogspot.com/2007/03/powershell-versus-perl.html ) Perl은 12초 걸린 것이 PowerShell은 20분이 걸렸다고 한다.

PowerShell은 현재 1.0버젼이며 2.0도 개발이 진행중이라고 하니 앞으로 어떻게 발전해갈지 지켜봐야 겠지만 Cmdlet등으로 Windows 운영체제 내부의 정보에 쉽고 편하게 접근해서 사용할 수 있다는 장점은 있으나 언어 그 자체의 견고함과  완성도에 있어서는 아직까지 부족한 점이 많은 듯 하다.

0 TrackBacks

Listed below are links to blogs that reference this entry: PowerShell은 Perl과 비슷하다?.

TrackBack URL for this entry: http://aero.sarang.net/cgi-bin/mt/mt-tb.cgi/120

Leave a comment

About this Entry

This page contains a single entry by aero published on February 24, 2009 3:13 PM.

Strawberry Perl Portable 출시 was the previous entry in this blog.

도메인 변경 aero.dnip.net -> aero.sarang.net is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.

Creative Commons License
This weblog is licensed under a Creative Commons License.
Powered by Movable Type 4.21-en