PowerShell contro Unix Shell


14

Ho sentito alcune cose sulle funzionalità di PowerShell. Alcune sembrano caratteristiche tipiche delle shell Unix.

Quindi sembra che Powershell includa piping e commandlet, simili agli script di shell. Ma non l'ho ancora provato (niente Windows), quindi potrei sbagliarmi.

Quindi la mia domanda è: Powershell è simile a una shell Unix o il concetto è diverso?
Se quest'ultimo: in quali punti il ​​concetto differisce?


2
Questa domanda è già stata posta su StackOverflow: stackoverflow.com/questions/573623/powershell-vs-unix-shells
Richard

Risposte:


20

PowerShell è superficialmente simile alle shell Unix. PowerShell ha alias per molti dei comandi a cui sei abituato in Unix, come ls, rm, cp, mv, ecc. Tuttavia, il modo in cui funzionano i cmdlet dietro gli alias è abbastanza diverso.

In una shell * nix, tutto è basato sul testo, quindi l'output da un comando può essere reindirizzato a un altro, ma il programma di ricezione deve sapere come analizzare / interpretare il testo dalla pipeline. Questa è la differenza principale tra PowerShell e * nix shell ... in PowerShell, tutto ciò che viene passato è un oggetto.

La conseguenza di ciò è che il piping da un comando all'altro non è solo il piping di stdout a stdin. Sta eseguendo il piping di un oggetto .net completo al ricevitore. Pertanto, il destinatario deve solo sapere come gestire un oggetto di quel tipo. Non ha bisogno di implementare alcuna analisi del testo, ma deve capire come chiamare metodi e proprietà (membri) dell'oggetto di input.

In un programma da riga di comando * nix, dovresti scrivere il codice che legge da stdin e analizza le sue informazioni dal testo generato da un altro programma. In PowerShell, dovresti fare qualcosa del genere:

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
}

Chiamare questo codice dalla riga di comando potrebbe essere simile a:

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

Puoi anche fare lo stesso come sopra usando il meccanismo di piping, ma puoi vedere la differenza principale qui nel fatto che stiamo passando un oggetto e non un testo:

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

Dimenticando questa grande differenza, direi che ci sono altre somiglianze superficiali, ma principalmente solo sintatticamente. La sintassi di PowerShell sembra essere stata progettata pensando agli utenti della shell * nix, quindi gran parte dello stile del linguaggio è simile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.