PowerShell vs. o Unix Shell

12

Eu ouvi algumas coisas sobre os recursos do PowerShell. Algumas delas parecem características típicas de shells Unix.

Portanto, o Powershell inclui a tubulação e os commandlets, semelhantes aos scripts de shell. Mas eu não tentei ainda (sem Windows), então eu posso estar errado.

Então, minha pergunta é: o Powershell é semelhante a um shell Unix ou o conceito é diferente?
Se este último: Em que pontos o conceito difere?

    
por Mnementh 18.12.2010 / 03:28

1 resposta

17

O PowerShell é superficialmente semelhante a shells Unix. O PowerShell possui aliases para muitos dos comandos aos quais você está acostumado no Unix, como ls, rm, cp, mv etc. No entanto, a maneira como os cmdlets por trás dos aliases funcionam é bem diferente.

Em um shell * nix, tudo é baseado em texto, então a saída de um comando pode ser canalizada para outro, mas o programa receptor deve saber como analisar / interpretar o texto do pipeline. Esta é a principal diferença entre os shells PowerShell e * nix ... no PowerShell, tudo que é passado por aí é um objeto.

A conseqüência disso é que canalizar de um comando para outro não é apenas stdout de canalização para stdin. É canalizar um objeto .net completo para o receptor. Portanto, o receptor só precisa saber como lidar com um objeto desse tipo. Ele não precisa implementar nenhuma análise de texto, mas precisa entender como chamar métodos e propriedades (membros) do objeto de entrada.

Em um programa de linha de comando * nix, você deve escrever um código que leia stdin e analise suas informações a partir do texto gerado por outro programa. No PowerShell, você faria algo assim:

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
}

Chamar este código na linha de comando pode parecer:

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

Você também pode fazer o mesmo que acima usando o mecanismo de piping, mas você pode ver a grande diferença aqui em que estamos passando um objeto e não um texto:

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

Esquecendo essa grande diferença, eu diria que existem outras semelhanças superficiais, mas principalmente apenas sintaticamente. A sintaxe do PowerShell parece ter sido projetada com os usuários do shell * nix em mente, portanto, muito do estilo da linguagem é semelhante.

    
por 18.12.2010 / 03:43