Unix tương đương với PowerShell?


21

Tôi luôn thấy khó xử khi các lệnh shell phức tạp liên quan đến phân tích cú pháp đầu ra văn bản bằng AWK . Về cơ bản, chúng tôi đang chuyển đổi dữ liệu có cấu trúc thành văn bản, sau đó phân tích lại văn bản để lấy lại dữ liệu có cấu trúc.

PowerShell là một trình bao Windows để tránh vấn đề đó bằng cách cho phép bạn chuyển các đối tượng được gõ giữa các lệnh shell thay vì chỉ văn bản.

Có bất kỳ hệ vỏ Unix nào dựa trên đối tượng thay vì dựa trên văn bản, như PowerShell không?

Câu trả lời:


24

Không, đó là cách khác. Không có muỗng ^ H ^ H ^ Dữ liệu được cấu trúc. Chỉ có văn bản.

Một phần lớn của triết lý Unix dựa trên ý tưởng xuất văn bản và chấp nhận văn bản làm đầu vào. Bạn có thể muốn xem xét việc đọc " Nghệ thuật lập trình Unix ", trong đó có một lời giải thích hay về điều này.

Đừng hiểu lầm tôi: Tôi hiểu quan điểm của bạn và tôi biết bạn đang cố gắng đạt được điều gì. Có những thứ như trình thông dịch tương tác của Ruby và Python, có thể được sử dụng như một trình bao, nhưng chúng không thân thiện với các tác vụ cơ bản như Bash. Hãy thử và thay đổi thư mục, ví dụ.

Ngoài ra, sử dụng các đối tượng trong một vỏ không phải là tất cả. Nếu chỉ vỏ của bạn hỗ trợ điều này, trên Unix, bạn sẽ thua lỗ. Tất cả các công cụ thao tác văn bản Unix tiêu chuẩn sẽ phải được thay đổi, như grep, awk, sed, v.v.

Tôi nghĩ rằng đã có một nỗ lực để tạo ra một cái gì đó như thế này một vài năm trước đây, nhưng tôi không thể nhớ tên và tôi đã không nghe về nó trong một thời gian dài. Có lẽ nó sẽ không cất cánh.


2
Thật thú vị, việc thay thế các luồng văn bản (hoặc thực tế là các luồng byte) bằng các luồng đối tượng dữ liệu sẽ không đi ngược lại các nguyên tắc chung được xây dựng trong cuốn sách. Nó thậm chí dường như chơi tốt hơn với "quy tắc đại diện". Chỉ là unix đã chọn các luồng văn bản làm giao diện giữa các chương trình.
Wim Coenen

1
Nhưng theo 'đối tượng dữ liệu', bạn có nghĩa là một đối tượng Python / Ruby / C ++ thực tế hoặc một cái gì đó giống như cấu trúc C?
wzzrd

3
+1 "Đừng cố uốn cong cái thìa, điều đó là không thể. Thay vào đó chỉ cố gắng nhận ra sự thật ... không có thìa." Nó không quá nhiều văn bản như một giao diện, mà là các luồng dữ liệu như một giao diện. Các đối tượng rất tốt cho lập trình, nhưng đôi khi chúng trở thành một nhà tù nhỏ bé để đưa tâm trí của bạn vào ...
Avery Payne

2
zsh> bash. Ý kiến ​​của tôi nhưng thực sự nếu bạn chưa thử zsh thì bạn nên
xenoterracide

2
@WimCoenen, vận chuyển xung quanh "dữ liệu có cấu trúc" có nghĩa là mọi người và dì Tillie phải đồng ý "cấu trúc" đó là gì. Ngay cả những thứ như ls(1). Hoàn toàn vô dụng.
vonbrand


4

Có một dự án, có mục tiêu chia sẻ tương tự với PowerShell: Hotwire . Nó kết hợp sh thường xuyên với kịch bản python và môi trường cửa sổ / đồ họa. Bạn có thể cho nó một cái nhìn.

Nó dựa trên đường ống hướng đối tượng mà bạn có thể mở rộng với các đối tượng của riêng mình bằng cách gói các chương trình hiện có hoặc sử dụng các thư viện Python.


1
Đó là dự án tôi đã cố nhớ tên! Cam kết cuối cùng trong thân cây: hai năm trước ...
wzzrd

4

PowerShell đã trở thành mã nguồn mở vào năm 2016. Kể từ đó, nó ngày càng trở nên đa nền tảng hơn. Mã nguồn có sẵn trên GitHub và các gói cài đặt cho một số hệ thống giống UNIX.


1

Tôi nghĩ rằng bạn có thể thực hiện hầu hết điều đó bằng cách viết một loạt các kịch bản được dịch (hoặc biên dịch), sau đó gọi chúng trong trình bao của trình thông dịch, sẽ trả lại hoặc bảo toàn các đối tượng của bạn và cứ thế nếu bạn muốn.

Bạn có thể làm điều này bằng ít nhất là Ruby, Perl, Python, Haskell (ví dụ: GHCi), JavaScript (ví dụ: node.js), Matlab và chắc chắn các ngôn ngữ khác ...


Đường ống là đối tượng có nghĩa là bạn có thể đánh giá lười biếng, v.v. Vì vậy, nếu bạn chuyển một tập hợp các đối tượng tệp xuống một đường ống .. có thể bạn quan tâm đến tên hoặc ngày sửa đổi, nhưng có thể là nội dung. Dữ liệu nào bạn vượt qua trong JSON? Trả lời: nó phụ thuộc. Nếu người tiêu dùng của đường ống kéo dữ liệu, nó có thể yêu cầu dữ liệu phù hợp. Vấn đề được giải quyết.
Nigel Thorne

1

Một suy nghĩ khác ba năm sau: Có thể biểu diễn một đối tượng bằng luồng văn bản bằng cách sử dụng XML hoặc JSON. Tôi thích JSON (đơn giản hơn) và thực sự có các dự án ngoài kia để cung cấp hỗ trợ JSON * NIX cổ điển. Ví dụ: https://github.com/step-/JSON.awk

Một vấn đề khi sử dụng mô hình kiểu đối tượng cho các chương trình * NIX cổ điển như AWK là chúng thực sự không có hỗ trợ OO. Ví dụ, trong khi AWK không có mảng kết hợp, thì mảng không phải là đa chiều (mỗi phần tử trong mảng AWK phải là một số hoặc một chuỗi; một mảng không được phép là một đối tượng mảng trong AWK).


Clojure cung cấp edn cho phép tất cả các loại dữ liệu được nhập được tuần tự hóa / giải tuần tự trong khi JSON bị hạn chế.
Mario
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.