2012-11-10 15 views
9

Tôi đã cài đặt F # 2.0 với Mono và tôi muốn ./ tập lệnh F # của mình. Tôi nên sử dụng dòng shebang nào cho Mac OS X? Dòng shebang này có thể được tổng quát hóa cho Mac OS X Linux không?Tôi nên sử dụng shebang nào cho tập lệnh F # trong Mac OS X?

+0

Tôi nghĩ điều này có thể có vấn đề vì '# 'không phải là nhận xét trong F # - bạn có thể viết một đoạn mã bash đơn giản hơn. Nếu bạn đang nói về các kịch bản đã biên dịch, cho linux có một bản vá hạt nhân để làm cho '. /' Work - không chắc chắn về mac –

+2

@JohnPalmer. Có, thiếu các chú thích '#' trong F # và các ngôn ngữ khác làm cho các shebang khó khăn hơn, mặc dù không phải là không thể. http://rosettacode.org/wiki/Multiline_shebang – mcandre

+0

khá gọn gàng - bạn có thể ẩn toàn bộ tập lệnh bash ở đó có thể cho phép bạn thực hiện các công cụ di động –

Trả lời

7

Vì vậy, trong câu trả lời @ mcandre của, nó hoạt động vì most shells revert to bourne shell khi họ không tìm thấy một công việc.

Vì vậy, có #light là cả hai F # hợp lệ và nhận xét trong bourne shell cho phép mỗi môi trường kịch bản để xem những gì nó hiểu.

Tuy nhiên, tập lệnh bên trong có thể được cải thiện. Khi chúng tôi thực thi tập lệnh, hãy thêm --quiet vào --exec có vẻ dư thừa, chúng tôi cũng hy vọng tất cả đối số sẽ được chuyển đến tập lệnh. Một phiên bản lý tưởng hơn sẽ là exec fsharpi --exec $0 $* vì vậy tất cả đối số sẽ được chuyển như thể bạn đã chạy lệnh một cách rõ ràng.

#light không phải là chỉ # đứng trước chỉ thị trong F #. Preprocessor định nghĩa cũng sẽ làm việc và có thể trực quan với những gì đang xảy ra. Việc đặt tập lệnh shell giữa #if run_with_bin_sh#endif sẽ ẩn với f # vì run_with_bin_sh sẽ không được xác định.

Ví dụ fsx:

#if run_with_bin_sh 
    exec fsharpi --exec $0 $* 
#endif 
printfn "%A" fsi.CommandLineArgs 

update: hỗ trợ công việc Bất động như #!/usr/bin/env fsharpi --exec đã được thêm vào official Microsoft F# code base. Vì vậy, nó sẽ làm việc với các phiên bản tương lai của F #.

cập nhật 2:#!/usr/bin/env fsharpi --exec hoạt động tốt cho mac nhưng không hoạt động trên linux. Linux cần phải là #!/usr/bin/fsharpi --execthe incompatibilty is annoying.

Nếu bạn muốn có nền tảng chéo shebang. Sau đây sẽ làm việc.

#!/bin/sh 
#if run_with_bin_sh 
    exec fsharpi --exec $0 $* 
#endif 
+1

'/ bin/usr/env' ??? trông có vẻ sai, đó có phải là lỗi đánh máy không? Tôi đoán bạn có nghĩa là '/ usr/bin/env' – knocte

+0

@knocte cảm ơn! – jbtule

10

Trong Mac OS X, chương trình là fsharpi.

hello.fs:

#light (* 
    exec fsharpi --exec $0 --quiet 
*) 

System.Console.WriteLine "Hello World" 
+0

Đây là tài liệu theo nghĩa đen không có nơi nào! Cảm ơn bạn. – Noldorin

+0

Tôi giả định rằng OP đã hỏi về các script F # (phần mở rộng .fsx), không phải tập tin F # (phần mở rộng .fs) – knocte