PowerShell против Unix Shell

PowerShell против Unix Shell

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

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

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

решение1

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

Связанный контент