PowerShell проти оболонки Unix


14

Я чув деякі речі про особливості PowerShell. Деякі з них здаються типовими особливостями оболонок Unix.

Тож здається, що Powershell включає в себе конвеєри та команди, подібні до скриптів оболонки. Але я ще не пробував цього (без Windows), тому я можу помилитися.

Отже, моє запитання: чи Powershell схожий на оболонку Unix чи концепція інша?
Якщо останнє: У яких моментах поняття відрізняється?


2
Це питання вже задавалося на StackOverflow: stackoverflow.com/questions/573623/powershell-vs-unix-shells
Річард

Відповіді:


20

PowerShell поверхнево схожий на оболонки Unix. PowerShell має псевдоніми для багатьох команд, до яких ви звикли в Unix, таких як ls, rm, cp, mv тощо. Однак спосіб роботи командлетів за псевдонімами зовсім інший.

У оболонці * 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 shell, тому багато стилів мови схожі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.