PowerShell против оболочки Unix

14

Я слышал кое-что об особенностях PowerShell. Некоторые из них кажутся типичными особенностями оболочек Unix.

Похоже, что Powershell включает в себя конвейер и командлеты, похожие на скрипты оболочки. Но я еще не пробовал (без Windows), поэтому могу ошибаться.

Итак, мой вопрос: похож ли Powershell на оболочку Unix или концепция отличается?
Если последнее: в каких пунктах концепция отличается?

Mnementh
источник
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, поэтому многие языковые стили схожи.

Роберт С Чаччо
источник