2012-04-08 34 views
12

Tôi muốn hiểu thế nào kịch bản Scala này hoạt động:Ý nghĩa của # (bang-pound) trong kịch bản lệnh shell sh/Bash là gì?

#!/usr/bin/env bash 
exec scala "$0" "[email protected]" 
!# 
object HelloWorld { 
    def main(args: Array[String]) { 
     println("Hello, world! " + args.toList) 
    } 
} 
HelloWorld main args 

On line 3, "! #" Làm là gì? Phần còn lại của tệp có được cung cấp cho standard input của chương trình Scala không? Ngoài ra, là '! #' Được ghi lại ở bất kỳ đâu?

NB: Điều gần nhất tôi có thể tìm thấy, mặc dù nó không có liên quan trực tiếp trong bất kỳ cách nào là Stack Overflow câu hỏi Why do you need to put #!/bin/bash at the beginning of a script file? (khoảng đầu một kịch bản Bash).

+2

Phiên bản Windows của câu hỏi này: http://stackoverflow.com/questions/6671913/scala-scripts-in-windows-batch-files –

Trả lời

18

Từ the original documentation:

Script files may have an optional header that is ignored if present. There are two ways to format the header: either beginning with #! and ending with !#, or beginning with ::#! and ending with ::!#.

Vì vậy, các mã sau chỉ là một tiêu đề cho một kịch bản Scala: Lỗi

#!/usr/bin/env bash 
exec scala "$0" "[email protected]" 
!# 
+0

Tốt. Sau đó, điều gì sẽ xảy ra với nội dung tập lệnh sau "! #"? –

+4

Scala chạy nó. 'Nội trang' exec' làm cho trình thông dịch 'scala' thành * thay thế * shell, vì vậy bash không bao giờ thấy dòng'! # '. Và 'scala' sẽ bỏ qua mọi thứ giữa và bao gồm' #! 'Và'! # '. – cHao

+0

Tôi nghĩ rằng đó là cách nó có thể đã làm việc, nhưng tôi không thể tìm thấy tài liệu cho nó ở bất cứ đâu. Cảm ơn bạn! –

2

Khi tôi loại bỏ !# trong chương trình mẫu trong BluesRockAddict's answer, tôi nhận được như sau tại bảng điều khiển:

error: script file does not close its header with !# or ::!# one error found

Từ t ông trên thông báo lỗi, tôi hiểu những điều sau đây:

  1. !# là thẻ đóng cho tiêu đề exec scala "$0" "[email protected]", mà có lẽ nói với Scala rằng bất cứ điều gì xảy ra sau khi !# là mã Scala để được thực thi.
  2. !# có thể được thay thế bằng ::!#.
2

Dựa hoàn toàn vào thử nghiệm (Tôi giả định này được mô tả ở đâu đó): (! #)

Bắt đầu với Scala 2.10.0, các phi tiêu chuẩn (từ một POV POSIX scripting) lb-nổ không yêu cầu dài hơn (hoặc được phép) trong môi trường vỏ POSIX. các công trình dòng sau đây (nhưng phải là dòng đầu tiên của kịch bản, không có dấu cách hàng đầu):

#!/usr/bin/env scala 

Tuy nhiên, cách duy nhất để cung cấp một công việc trong một cửa sổ tập tin batch là để lừa nó vào gọi Scala với chính nó như là đối số đầu tiên. Do đó, Scala cần phải biết vị trí dòng cuối cùng của tệp lô là, và do đó yêu cầu đóng ::! # Line. Dưới đây là một ví dụ làm việc:

::#! 
call scala %0 %* 
goto :eof 
::!# 

Correction: Tôi ban đầu đã có #/usr/bin/env scalav (chú ý dấu v), đó là kịch bản của tôi để xác định tài sản "scala.script", thêm một số thư viện để! classpath, trước bản thân 'exec scala'. Bằng cách đó, có thể xác định tên của tập lệnh đang được thực thi, mặc dù scalav phải nằm trong PATH của bạn.

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