PowerShell vs. Unix Shell

14

Saya pernah mendengar beberapa hal tentang fitur PowerShell. Beberapa di antaranya seperti fitur khas kerang Unix.

Jadi sepertinya Powershell termasuk piping dan commandlets, mirip dengan skrip shell. Tapi saya belum mencobanya (tidak ada Windows), jadi saya mungkin salah.

Jadi pertanyaan saya adalah: Apakah Powershell mirip dengan shell Unix atau konsepnya berbeda?
Jika yang terakhir: Dalam poin apa konsepnya berbeda?

Mnementh
sumber
2
Pertanyaan ini sudah ditanyakan di StackOverflow: stackoverflow.com/questions/573623/powershell-vs-unix-shells
Richard

Jawaban:

20

PowerShell sangat mirip dengan shell Unix. PowerShell memiliki alias untuk banyak perintah yang biasa Anda gunakan di Unix, seperti ls, rm, cp, mv, dll. Namun, cara cmdlet di belakang alias bekerja sangat berbeda.

Dalam shell * nix, semuanya berbasis teks, jadi output dari satu perintah dapat disalurkan ke perintah lain, tetapi program penerima harus tahu cara mem-parsing / menginterpretasikan teks dari pipeline. Ini adalah perbedaan utama antara PowerShell dan * nix shells ... di PowerShell, semua yang dilewatkan adalah objek.

Konsekuensi dari ini adalah bahwa pemipaan dari satu perintah ke perintah lain tidak hanya pemipaan stdout ke stdin. Ini memipakan objek .net penuh ke penerima. Oleh karena itu, penerima hanya perlu tahu cara menangani objek jenis itu. Itu tidak perlu menerapkan penguraian teks, tetapi perlu memahami cara memanggil metode dan properti (anggota) dari objek input.

Dalam program baris perintah * nix, Anda akan menulis kode yang membaca dari stdin dan mem-parsing informasinya dari teks yang dihasilkan program lain. Di PowerShell, Anda akan melakukan sesuatu seperti ini:

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
}

Memanggil kode ini di baris perintah mungkin terlihat seperti:

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

Anda juga bisa melakukan hal yang sama seperti di atas menggunakan mekanisme perpipaan, tetapi Anda dapat melihat perbedaan utama di sini karena kami melewati objek dan bukan teks:

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

Melupakan perbedaan utama ini, saya akan mengatakan ada kesamaan dangkal lainnya, tetapi sebagian besar hanya secara sintaksis. Sintaks PowerShell tampaknya telah dirancang dengan mempertimbangkan pengguna shell * nix, sehingga banyak gaya bahasa yang serupa.

Robert S Ciaccio
sumber