PowerShell vs. Unix Shell

14

Słyszałem kilka rzeczy o funkcjach PowerShell. Niektóre z nich wydają się typowymi cechami powłok uniksowych.

Wygląda na to, że Powershell zawiera potoki i komendy, podobnie jak skrypty powłoki. Ale jeszcze tego nie próbowałem (bez systemu Windows), więc mogę się mylić.

Moje pytanie brzmi: czy Powershell jest podobny do powłoki uniksowej, czy też koncepcja jest inna?
Jeśli to drugie: w jakich punktach koncepcja różni się?

Memento
źródło
2
To pytanie zostało już zadane na StackOverflow: stackoverflow.com/questions/573623/powershell-vs-unix-shells
Richard

Odpowiedzi:

20

PowerShell jest powierzchownie podobny do powłok uniksowych. PowerShell ma aliasy dla wielu poleceń, do których jesteś przyzwyczajony w Uniksie, takich jak ls, rm, cp, mv itp. Jednak sposób, w jaki działają cmdlety za aliasami, jest zupełnie inny.

W powłoce * nix wszystko opiera się na tekście, więc dane wyjściowe z jednej komendy można przesyłać do innej, ale program odbierający musi wiedzieć, jak parsować / interpretować tekst z potoku. Jest to główna różnica między powłokami PowerShell i * nix ... w PowerShell wszystko , co jest przekazywane, to obiekt.

Konsekwencją tego jest to, że przesyłanie strumieniowe z jednego polecenia do drugiego nie jest tylko przesyłaniem strumieniowym stdout do stdin. Przesyła do odbiornika pełnoprawny obiekt .net. Dlatego odbiornik musi tylko wiedzieć, jak obsługiwać obiekt tego typu. Nie musi implementować żadnego parsowania tekstu, ale musi zrozumieć, jak wywoływać metody i właściwości (członków) obiektu wejściowego.

W programie wiersza poleceń * nix pisałbyś kod, który odczytuje ze standardowego wejścia i analizuje informacje z tekstu wygenerowanego przez inny program. W PowerShell zrobiłbyś coś takiego:

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
}

Wywołanie tego kodu w wierszu poleceń może wyglądać następująco:

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

Możesz również zrobić to samo, co powyżej, korzystając z mechanizmu potokowania, ale widzisz tutaj główną różnicę w tym, że przekazujemy obiekt, a nie tekst:

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

Zapominając o tej zasadniczej różnicy, powiedziałbym, że istnieją inne powierzchowne podobieństwa, ale głównie tylko składniowe. Wygląda na to, że składnia PowerShell została zaprojektowana z myślą o użytkownikach powłoki * nix, więc wiele stylów językowych jest podobnych.

Robert S. Ciaccio
źródło