2012-04-20 31 views
41

Tôi vừa yêu vừa ghét viết Bash. Tôi thích rằng đó là vì vậy được sắp xếp hợp lý để hoạt động trên các tệp và làm việc với các quy trình (Tôi đồng ý với this popular question rằng cách này tốt hơn về vấn đề này so với Python, Ruby, v.v.), nhưng ghét cú pháp, đặc biệt là xung quanh điều kiện, vòng lặp vvCó bất kỳ ngôn ngữ nào biên dịch thành Bash không?

(Đây là chủ quan, nhưng tôi thấy nó cả hai khó hiểu và gây phiền nhiễu Ví dụ $var khi đọc, nhưng var khi viết;. viết âm thầm thất bại nếu có khoảng trống xung quanh =; khung đôi trong IFS khi sử dụng regexp; đôi dấu chấm phẩy đôi khi và dấu chấm phẩy đơn khác, v.v.)

Là người hâm mộ lớn của CoffeeScript, c ompiles để JS, tôi đã tự hỏi: có bất kỳ ngôn ngữ có tính thẩm mỹ/cú pháp của các ngôn ngữ như Python/Ruby/CoffeeScript nhưng biên dịch và chạy như Bash thay vì một trong những runtimes khác?

Ví dụ: Tôi rất muốn có thể viết chủ yếu-Bash với cú pháp đơn giản hơn chỉ là một chút:

$AGGREGATE_FILENAME = 'allfiles.txt' 

if not exists $AGGREGATE_FILENAME 
    touch $AGGREGATE_FILENAME 

for $file in files/* 
    cat $file >> $AGGREGATE_FILENAME 

switch $1 
    case 'test' 
     run-tests 
     echo 'Tests finished!' 
    case 'deploy' 
     echo 'Packaging...' 
     mv foo bar/ 
     deploy-bar 

Đây là một ví dụ siêu giả tạo, và cú pháp là một strawman (chủ yếu lấy cảm hứng từ CoffeeScript nhưng vẫn giữ khái niệm Bash thiết yếu của các lệnh hạng nhất, được phân tách khỏi các biến và đánh máy rời).

Dù sao, chỉ là một câu hỏi và thực phẩm cho suy nghĩ. Tôi muốn yêu thích để có thể viết kịch bản của tôi trong một thứ gì đó đẹp hơn Bash. =) Cảm ơn!

+3

Bạn đã cân nhắc xem xét Perl chưa? Nó có các tập tin globs, kiểm tra sự tồn tại ngắn gọn ('' 'print 'exist' nếu (-e $ filename);' '') và thực hiện backtick. – tjdett

+0

Tôi chưa bao giờ thử Perl. Tôi nghĩ rằng tôi đã viết câu hỏi này, nhưng tôi luôn cho rằng Perl cũng đầy cú pháp không thể hiểu nổi. = D Tôi sẽ kiểm tra nó - cảm ơn! –

+2

Nó có thể được. May mắn thay, bạn không cần phải thực sự * sử dụng * phần lớn trong số đó. –

Trả lời

14

Kể từ khi tôi ban đầu được hỏi câu hỏi này, hai dự án đã được công bố mà tấn công vấn đề này và làm một công việc khá tốt. Cả hai reimplement nhiều/hầu hết các công cụ Unix trong runtimes lập trình thân thiện hơn.

plumbum được thực hiện bằng Python và trông khá vững chắc:

http://plumbum.readthedocs.org/en/latest/index.html

ShellJS được thực hiện trên Node.js và cũng có vẻ khá tốt:

https://github.com/arturadib/shelljs

phát triển Sôi động! Tôi rất mong được thử chúng. Nếu bạn đã có, nó sẽ là tuyệt vời để nghe kinh nghiệm của bạn trong các ý kiến. Cảm ơn!

5

Vấn đề là toàn bộ ngữ nghĩa dựa trên chuỗi của Bash bị phá vỡ rất khủng khiếp, thật khó để làm một việc như CoffeeScript cho Bash.

Vì bạn có thể không cần khả năng tương tác cấp chức năng để gọi các hàm được viết bằng Bash, bạn nên sử dụng một cái gì đó hoàn toàn khác. Perl gần gũi với Bash trong khó chịu và đầy đủ các phím tắt và cú pháp kỳ lạ, nhưng ngữ nghĩa của nó chủ yếu là âm thanh. Python ít thoải mái hơn cho những thứ như khởi chạy quy trình nhưng tốt hơn rất nhiều cho việc lập trình hệ thống chung, sạch sẽ và dễ bảo trì. Python có các thư viện và mô-đun tuyệt vời cho mọi thứ; Perl thậm chí còn tốt hơn.

+1

Tôi thực sự không nghĩ rằng Perl là những gì anh chàng này đang tìm kiếm, xem xét ông muốn có ít "tiếng ồn" trong các kịch bản của mình. –

2

Bạn có thể muốn thử ZSh, nó có rất nhiều cải tiến để làm cho tập lệnh shell của bạn dễ đọc hơn.

http://www.zsh.org

17

Bạn cũng có thể thử Batsh, là một DSL (Domain-Specific Language) biên dịch ngôn ngữ cú pháp C thành Bash (và Windows Batch).

+0

Theo như tôi có thể nói dự án Batsh đã bị bỏ rơi. Sử dụng phiên bản 1.2.2 opam Tôi không thể có được điều này để cài đặt (lỗi biên dịch) – portforwardpodcast

1

Bạn có thể muốn có một cái nhìn vào nscript, trong đó bạn có thể viết kịch bản shell sử dụng javascript. Tất cả các công trình xây dựng bash phổ biến là ở đó, giống như mã xuất cảnh, ống, chuyển hướng dòng, mở rộng đối số, globbing, nhanh chóng, vv

4

bish là một tùy chọn:

https://github.com/tdenniston/bish

Shell kịch bản với một cảm giác hiện đại.

Bish là một ngôn ngữ nhẹ được tạo để mang kịch bản lệnh shell vào thế kỷ 21. Nó cung cấp cho các lập trình viên sự thoải mái của cú pháp hiện đại nhưng biên dịch thành Bash, dẫn đến tính di động tốt (nhiều như Bash là di động).

2

Tôi đã thử tất cả những điều trên (results) và bắt đầu powscript.

khác biệt powscript vs các công cụ trên

  • tiền xử lý cực kỳ di động (100% bash)
  • dư giữa coffeescript và bash
  • hasslefree cầm tay all-in-one-file biên dịch/thời gian chạy, được viết bằng bash
  • transpiler lỏng lẻo: bash nội dòng luôn có thể
+0

Tôi đang thực sự sử dụng powscript và thực sự thích nó. Tôi sẽ chỉ nói rằng thông dịch viên nên rõ ràng hơn. –

0

Gần đây tôi đã phát triển một ngôn ngữ được gọi là BashClassHướng đối tượng, có loại kiểm tra và cho phép nhiều chiều mảng. Cú pháp ngôn ngữ được lấy cảm hứng từ các ngôn ngữ lập trình khác nhau.

Dưới đây là một ví dụ về cách một lớp List được thực hiện (Full dụ here):

class List extends Object { 
    var Object[] data = new Object[]; 
    var int size = 0; 
    constructor List(){ 
     super_constructor(); 
    } 

    function void add(var Object object) { 
     data[size] = object; 
     size = size + 1; 
    } 

    function void pop() { 
     if(size == 0) { 
      exception("Cannot remove element from an empty list"); 
     } 
     size = size - 1; 
     data[size] = null; 
    } 

    function int size() { 
     return size; 
    } 

    function Object get(var int index) { 
     if(index < 0 || index >= size) { 
      exception("Cannot access element out of bound"); 
     } 
     return data[index]; 
    } 
} 

lớp và mảng đa chiều trong BashClass được chuyển đổi thành Bash 4,4 mảng kết hợp. Ngôn ngữ được phát hành lần đầu tiên và là nguồn mở trên Github. Cảm thấy tự do để contirbute và đề xuất các tính năng.

Các vấn đề liên quan