Ouvi algumas coisas sobre os recursos do PowerShell. Algumas delas parecem características típicas dos shells Unix.
Parece que o Powershell inclui piping e commandlets, semelhantes aos scripts de shell. Mas ainda não tentei (sem Windows), então posso estar errado.
Então, minha pergunta é: o Powershell é semelhante a um shell Unix ou o conceito é diferente?
Neste último caso: em que pontos o conceito difere?
Responder1
O PowerShell é superficialmente semelhante aos shells Unix. O PowerShell possui aliases para muitos dos comandos com os 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, portanto 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,tudoque é passado é um objeto.
A consequência disso é que canalizar de um comando para outro não é apenas canalizar stdout para stdin. Ele está canalizando um objeto .net completo para o receptor. Portanto, o receptor só precisa saber como lidar com um objeto desse tipo. Não é necessário 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ê escreveria um código que lê stdin e analisa 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 ser semelhante a:
PS> $myObject = New-Object MyType -arg "OriginalName"
PS> $myObject = changeName $myNewObject
OriginalName
PS> $myObject.Name
NewName
Você também poderia fazer o mesmo acima usando o mecanismo de tubulação, mas você pode ver a principal diferença aqui: estamos passando um objeto e não um texto:
PS> $myObject = New-Object MyType -arg "OriginalName" | changeName
OriginalName
PS> $myObject.Name
NewName
Esquecendo esta grande diferença, eu diria que existem outras semelhanças superficiais, mas principalmente apenas sintaticamente. A sintaxe do PowerShell parece ter sido projetada tendo em mente os usuários do shell *nix, portanto, grande parte do estilo da linguagem é semelhante.