PowerShell frente a Unix Shell

PowerShell frente a Unix Shell

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

Entonces parece que Powershell incluye tuberías y comandos, similares a los scripts de Shell. Pero aún no lo probé (sin Windows), por lo que puede que me equivoque.

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

Respuesta1

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,todolo que se transmite es un objeto.

La consecuencia de esto es que pasar de un comando a otro no es simplemente pasar de salida estándar a entrada estándar. Está canalizando un objeto .net completo al receptor. Por tanto, el receptor sólo necesita saber cómo manejar un objeto de ese tipo. No necesita implementar ningún análisis de texto, pero necesita entender cómo llamar a métodos y propiedades (miembros) del objeto de entrada.

En un programa de línea de comandos *nix, escribiría código que lea desde la entrada estándar y analice su información a partir del texto generado por otro programa. En PowerShell, harías 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 puedes hacer lo mismo que arriba usando el mecanismo de tubería, pero puedes ver la diferencia principal aquí en que estamos pasando un objeto y no 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 teniendo en mente a los usuarios de *nix shell, por lo que gran parte del estilo del lenguaje es similar.

información relacionada