PowerShell contra el shell de Unix

14

He escuchado algunas cosas sobre las características de PowerShell. Algunas de ellas parecen características típicas de los shells de Unix.

Por lo tanto, parece que Powershell incluye tuberías y comandos, similares a los scripts de shell. Pero todavía no lo intenté (sin Windows), así que puedo estar equivocado.

Entonces mi pregunta es: ¿Powershell es similar a un shell de Unix o el concepto es diferente?
Si este último: ¿en qué puntos difiere el concepto?

Mnementh
fuente
2
Esta pregunta ya se hizo en StackOverflow: stackoverflow.com/questions/573623/powershell-vs-unix-shells
Richard

Respuestas:

20

PowerShell es superficialmente similar a los shells de Unix. PowerShell tiene alias para muchos de los comandos a los que está acostumbrado en Unix, como ls, rm, cp, mv, etc. Sin embargo, la forma en que funcionan los cmdlets detrás de los alias es bastante diferente.

En un shell * nix, todo está basado en texto, por lo que la salida de un comando se puede canalizar a otro, pero el programa receptor debe saber cómo analizar / interpretar el texto de la canalización. Esta es la principal diferencia entre PowerShell y * nix shells ... en PowerShell, todo lo que se pasa es un objeto.

La consecuencia de esto es que la canalización de un comando a otro no es simplemente canalizar stdout a stdin. Está canalizando un objeto .net completo al receptor. Por lo tanto, el receptor solo necesita saber cómo manejar un objeto de ese tipo. No necesita implementar ningún análisis de texto, pero necesita comprender cómo llamar a los métodos y propiedades (miembros) del objeto de entrada.

En un programa de línea de comando * nix, escribiría código que se lee desde stdin y analiza su información a partir del texto generado por otro programa. En PowerShell, haría algo como esto:

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
}

Llamar a este código en la línea de comando podría verse así:

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

También puede hacer lo mismo que anteriormente usando el mecanismo de tubería, pero puede ver la gran diferencia aquí en que estamos pasando un objeto y no un texto:

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

Olvidando esta gran diferencia, diría que hay otras similitudes superficiales, pero principalmente sintácticamente. La sintaxis de PowerShell parece haber sido diseñada pensando en los usuarios de shell * nix, por lo que gran parte del estilo del lenguaje es similar.

Robert S Ciaccio
fuente