PowerShell과 Unix 셸 비교

PowerShell과 Unix 셸 비교

PowerShell의 기능에 대해 몇 가지 이야기를 들었습니다. 그 중 일부는 Unix 쉘의 전형적인 기능처럼 보입니다.

따라서 Powershell에는 셸 스크립트와 유사한 파이프 및 커맨드렛이 포함되어 있는 것 같습니다. 하지만 아직 (Windows 없음) 시도하지 않았으므로 틀렸을 수도 있습니다.

그래서 제 질문은: Powershell이 ​​Unix 셸과 비슷합니까, 아니면 개념이 다른가요?
후자의 경우: 어떤 점에서 개념이 다른가요?

답변1

PowerShell은 표면적으로 Unix 셸과 유사합니다. PowerShell에는 ls, rm, cp, mv 등과 같이 Unix에서 사용되는 많은 명령에 대한 별칭이 있습니다. 그러나 별칭 뒤의 cmdlet이 작동하는 방식은 상당히 다릅니다.

*nix 셸에서는 모든 것이 텍스트 기반이므로 한 명령의 출력을 다른 명령으로 파이프할 수 있지만 수신 프로그램은 파이프라인의 텍스트를 구문 분석/해석하는 방법을 알아야 합니다. 이것이 PowerShell과 *nix 셸의 주요 차이점입니다. PowerShell에서는모든 것전달되는 것은 객체입니다.

결과적으로 한 명령에서 다른 명령으로의 파이프 연결은 단순히 stdout을 stdin으로 파이프하는 것이 아닙니다. 완전한 .net 개체를 수신기에 연결합니다. 따라서 수신자는 해당 유형의 객체를 처리하는 방법만 알면 됩니다. 텍스트 구문 분석을 구현할 필요는 없지만 입력 개체의 메서드 및 속성(멤버)을 호출하는 방법을 이해해야 합니다.

*nix 명령줄 프로그램에서는 stdin에서 읽고 다른 프로그램이 생성한 텍스트에서 해당 정보를 구문 분석하는 코드를 작성합니다. PowerShell에서는 다음과 같은 작업을 수행합니다.

function changeName($myObject)
{
    if ($myObject.GetType() -eq [MyType])
    {
        #print the current name to screen
        $myObject.Name
        #change string in the 'name' property
        $myObject.Name = "NewName"
    }
    return $myObject
}

명령줄에서 이 코드를 호출하는 방법은 다음과 같습니다.

PS> $myObject = New-Object MyType -arg "OriginalName"
PS> $myObject = changeName $myNewObject
OriginalName
PS> $myObject.Name
NewName

파이핑 메커니즘을 사용하여 위와 동일한 작업을 수행할 수도 있지만 여기서는 텍스트가 아닌 객체를 전달한다는 점에서 주요 차이점을 볼 수 있습니다.

PS> $myObject = New-Object MyType -arg "OriginalName" | changeName
OriginalName
PS> $myObject.Name
NewName

이 주요 차이점을 잊어버리면 다른 피상적인 유사점이 있지만 대부분 구문론적인 유사점이 있다고 말하고 싶습니다. PowerShell 구문은 *nix 셸 사용자를 염두에 두고 설계된 것으로 보이므로 언어 ​​스타일이 많이 유사합니다.

관련 정보