PowerShell so với Unix Shell


14

Tôi đã nghe một số điều về các tính năng của PowerShell. Một số trong đó có vẻ như các tính năng điển hình của shell Unix.

Vì vậy, có vẻ như Powershell bao gồm đường ống và các lệnh, tương tự như các kịch bản shell. Nhưng tôi chưa thử nó (chưa có Windows), vì vậy tôi có thể sai.

Vì vậy, câu hỏi của tôi là: Powershell tương tự như một vỏ Unix hay là khái niệm khác nhau?
Nếu sau này: Trong những điểm nào khái niệm khác nhau?


2
Câu hỏi này đã được hỏi trên StackOverflow: stackoverflow.com/questions/573623/powershell-vs-unix-shells
Richard

Câu trả lời:


20

PowerShell rất giống với hệ vỏ Unix. PowerShell có bí danh cho nhiều lệnh bạn đã sử dụng trong Unix, như ls, rm, cp, mv, v.v. Tuy nhiên, cách mà các lệnh ghép ngắn đằng sau các bí danh hoạt động hoàn toàn khác nhau.

Trong trình bao * nix, mọi thứ đều dựa trên văn bản, do đó, đầu ra từ một lệnh có thể được chuyển sang lệnh khác, nhưng chương trình nhận phải biết cách phân tích / giải thích văn bản từ đường ống. Đây là điểm khác biệt chính giữa các vỏ PowerShell và * nix ... trong PowerShell, mọi thứ được truyền xung quanh là một đối tượng.

Hậu quả của việc này là đường ống từ lệnh này sang lệnh khác không chỉ là đường ống dẫn đến stdin. Đó là đường ống một đối tượng .net đầy đủ đến máy thu. Do đó, người nhận chỉ cần biết cách xử lý một đối tượng thuộc loại đó. Nó không cần phải thực hiện bất kỳ phân tích cú pháp văn bản nào, nhưng nó cần hiểu cách gọi các phương thức và thuộc tính (thành viên) của đối tượng đầu vào.

Trong chương trình dòng lệnh * nix, bạn sẽ viết mã đọc từ stdin và phân tích thông tin của nó từ văn bản mà chương trình khác tạo ra. Trong PowerShell, bạn sẽ làm một cái gì đó như thế này:

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
}

Gọi mã này trên dòng lệnh có thể giống như:

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

Bạn cũng có thể làm tương tự như trên bằng cách sử dụng cơ chế đường ống, nhưng bạn có thể thấy sự khác biệt chính ở đây là chúng ta đang truyền một đối tượng chứ không phải văn bản:

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

Quên đi sự khác biệt lớn này, tôi sẽ nói có những điểm tương đồng bề ngoài khác, nhưng chủ yếu chỉ là về mặt cú pháp. Cú pháp PowerShell dường như đã được thiết kế dành cho người dùng shell * nix, vì vậy rất nhiều kiểu ngôn ngữ tương tự nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.