2011-10-09 5 views
26

내가 직접 내 Perl 스크립트를 실행하는 데 shebangs를 사용하여 좋아 :Go Shebang 라인은 무엇입니까?

#!/usr/bin/env perl 

바둑 프로그램의 오두막 무엇입니까?

+4

. 너는 새끼 먹이가 필요 없어. 권리? –

+0

[golang-nuts의 토론 스레드] (https://groups.google.com/d/msg/golang-nuts/iGHWoUQFHjg/hEhYPQjP3HcJ) [유사한 블로그] (http://stackoverflow.com)와 비슷한 게시물이 있습니다./users/1040891)의 [대답] (http : // stackoverflow.com/a/17900932/109747) –

답변

9

Go 프로그램은 바이너리로 컴파일됩니다. 소스에서 직접 실행할 수있는 옵션이 없다고 생각합니다.

이것은 C++이나 Java와 같은 다른 컴파일 언어와 유사합니다. 일부 언어 (Haskell과 같은)는 완전히 컴파일 된 모드와 "스크립트"모드를 제공합니다.이 모드는 소스 코드에서 직접 실행할 수 있습니다.

+0

+1 Perl은 인터프리터 스크립팅 언어입니다. –

13

기본적으로 하나도 없습니다. 하지만 gorun이라는 타사 도구를 사용하면 할 수 있습니다. https://wiki.ubuntu.com/gorun

불행히도 컴파일러는 shebang 행을 좋아하지 않습니다. gorun으로 실행하는 동일한 코드를 컴파일 할 수 없습니다.

+0

Argh. 6g과 친구 bork 그들이 shebang을 볼 때. – mcandre

+0

죄송합니다. 언급 했어야합니다. 편집 됨. –

34

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

예 :

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

이가있다 : 코멘트 와 쉘 추가 무시 하나의 라인으로

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

import "fmt" 

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

이동 치료 ///

+1

shebang을 편집하여 hello_world.go가 아닌 Go 파일에 적용 할 수 있습니까? 어쩌면'$ 0' 등을 사용할 것인가? – mcandre

+6

그건 세방 줄이 아니야. '#! '으로 시작해야합니다. (이동이 그것을 좋아하지 않는다는 것을 안다). 이것은 이식성이 없지만 많은 사람들에게 충분할 수 있으므로 대답에 +1하십시오. – topskip

+2

다음과 같이 작성하는 것이 더 좋습니다 :'/// usr/bin/env go run $ 0 $ @; exit' – ivanzoid

11

나는이 선호 몇 가지 장점은 هوم에 의해 답변에 비해 جاویدپور :

  • 용도 '간부'는 손자 프로세스를 시작하는 대신 새로운 쉘 프로세스를 교체합니다. 결과적으로 Go 프로그램은 직접적인 하위 프로세스가됩니다. 이것은보다 효율적이며 디버깅 및 모니터링과 같은 일부 고급 상황에서도 중요합니다.

  • 적절한 인수 견적. 공백과 특수 문자는 문제를 일으키지 않습니다.

  • "///"의 앞부분은 "//"보다 표준을 준수합니다. "//"만 사용하면 구현 정의 동작에 부딪 힐 위험이 있습니다. 이상의 두 문자를 선도 있지만 경로 이름은 두 개의 연속 문자, 선두 문자 후 첫 구성 요소가 구현 정의 된 방식으로 을 해석 할 수있다로 시작하는 경우

: 여기 http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html에서 인용입니다 단일 문자로 취급되어야한다.

나는이 답변을 bash, dash, zsh 및 ksh로 테스트했습니다.

예 : 이동이 컴파일

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

사실을 stderr로 출력하고 실행을 끝내는 코드가 0이 아닌 종료 코드를 가진 프로그램 os.Exit()이 종료 코드로 1을 반환하면이를 지적하고 싶습니다. – tmc

+0

이것 또한 대답에 해당합니다. –

+2

'/ bin/true'는 이식성이 없습니다 (예 : OSX 및 Zsh) – Kreisquadratur