2011-10-09 30 views
26

Tôi thích sử dụng shebangs để chạy các script Perl tôi trực tiếp:Đường đi shebang phù hợp là gì?

#!/usr/bin/env perl 

các công việc cho các chương trình Go là gì?

+4

Go được biên dịch. Bạn không nên cần một shebang. Đúng? –

+0

[Chuỗi thảo luận trong golang-hạt] (https://groups.google.com/d/msg/golang-nuts/iGHWoUQFHjg/hEhYPQjP3HcJ) có một bài đăng tương tự với [هومن جاویدپور] (http://stackoverflow.com/users/1040891) 's [answer] (http: // stackoverflow.com/a/17900932/109747) –

Trả lời

9

Các chương trình đi được biên dịch thành mã nhị phân; Tôi không nghĩ rằng có một tùy chọn để chạy chúng trực tiếp từ nguồn.

Điều này tương tự với các ngôn ngữ được biên dịch khác như C++ hoặc Java. Một số ngôn ngữ (như Haskell) cung cấp cả một chế độ được biên dịch đầy đủ và một chế độ "tập lệnh" mà bạn có thể chạy trực tiếp từ nguồn với một dòng shebang.

+0

+1 máy Perl là một ngôn ngữ kịch bản được giải thích .... –

13

Không có theo mặc định. Có một công cụ của bên thứ ba được gọi là gorun mà sẽ cho phép bạn làm điều đó, mặc dù. https://wiki.ubuntu.com/gorun

Thật không may các trình biên dịch không thích dòng shebang. Bạn không thể biên dịch cùng mã bạn chạy với gorun.

+0

Argh. 6g và bạn bè bork khi họ nhìn thấy một shebang. – mcandre

+0

Xin lỗi, tôi nên đề cập đến điều đó. Đã chỉnh sửa. –

34

//usr/bin/go run $0 [email protected] ; exit

dụ:

//usr/bin/go run $0 [email protected] ; exit 
package main 

import "fmt" 

func main() { 
    fmt.Println("Hello World!") 
} 

đi điều trị // như một dòng bình luận và vỏ bỏ qua thêm/

+1

Bạn có thể chỉnh sửa shebang để áp dụng cho bất kỳ tệp Go nào, không chỉ hello_world.go? Có thể sử dụng '$ 0' hoặc như vậy? – mcandre

+6

Đó không phải là một dòng shebang. Nó sẽ bắt đầu bằng '#!'. (Biết rằng đi không thích nó). Đây không phải là di động, nhưng có lẽ đủ tốt cho nhiều người, vì vậy +1 cho câu trả lời. – topskip

+2

Tôi nghĩ tốt hơn nên viết như sau: '/// usr/bin/env go run $ 0 $ @; exit' – ivanzoid

11

tôi thích điều này:

///bin/true; exec /usr/bin/env go run "$0" "[email protected]" 

này có một số ưu điểm so với câu trả lời của هوم جاویدپور:

  • Sử dụng 'exec' để thay thế cho quá trình vỏ mới thay vì tung ra một quá trình cháu. Do đó, chương trình Go của bạn sẽ là một tiến trình con trực tiếp. Điều này hiệu quả hơn và nó cũng quan trọng đối với một số tình huống nâng cao, chẳng hạn như gỡ lỗi và giám sát.

  • Trích dẫn các đối số phù hợp. Dấu cách và ký tự đặc biệt sẽ không gây ra sự cố.

  • Hàng đầu "///" tuân thủ nhiều tiêu chuẩn hơn chỉ "//". Nếu bạn chỉ sử dụng "//", bạn có nguy cơ gặp phải hành vi được xác định thực hiện. Dưới đây là một trích dẫn từ http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html:

Nếu một tên đường dẫn bắt đầu với hai nhân vật liên tiếp, các thành phần đầu tiên sau các nhân vật hàng đầu có thể được hiểu một cách thực hiện xác định, mặc dù hơn hai hàng đầu ký tự sẽ được coi là một ký tự đơn.

Tôi đã thử nghiệm câu trả lời này với bash, dấu gạch ngang, zsh và ksh.

Ví dụ:

///bin/true; exec /usr/bin/env go run "$0" "[email protected]" 
package main 
import "fmt" 
func main() { 
    fmt.Println("你好!") 
} 
+1

Tôi muốn chỉ ra rằng nếu chương trình của bạn os.Exit() s với một mã số khác không phải là thực tế là in ấn để stderr và đi chạy trả về 1 như là mã thoát của nó. – tmc

+0

Điều này cũng đúng với câu trả lời từ هومن جاویدپور –

+2

Sử dụng '/ bin/true' không phải là di động (ví dụ: OSX và Zsh) – Kreisquadratur

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