2009-07-14 4 views
14

나는 하스켈이 같은 작업을 수행 할 수 있습니다파일 시작 부분의 #!/usr/bin/...은 무엇을 의미합니까?

#!/usr/bin/runghc 
main=putStrLn "Hello World" 

그럼 난 ./hello.hs

내 질문을 실행할 수는 왜 첫 번째 줄은 무시한다? haskell의 주석은 --으로 시작하지만 첫 번째 줄은 여전히 ​​무시 된 것 같습니다. 심지어 ghci로로드됩니다. 이 트릭은 Python과 Perl에서도 작동합니다.

하지만 자바에서 비슷한 일을 수행 할 때

#!/usr/local/jdk1.6.0_13/bin/javac 
... 

javac의 나에게 컴파일러 오류를 제공합니다.

어떻게 작동합니까? 그리고 Java로 어떻게 작동합니까?

감사합니다.

+0

[왜 사람들은 #!/usr/bin/env python을 파이썬 스크립트의 첫 번째 줄에 쓰는가?] (http://stackoverflow.com/questions/2429511/why-do-people-write -usr-bin-env-python-script-on-a-python-script) –

답변

15

# : 그런 구조가 이해한다면 ... 그것은하지 않는 ... 그것과 같을 것이다! 이름은 "shebang"이며 Unix의 스크립트 실행 방법입니다. OS가 파일을 실행하도록 요청할 때 이것은 정상적인 .exe 파일이 아니며 #! 시작시 은 #! 다음에 명령을 실행하도록 OS에 지시하는 마술 마커 역할을합니다.myfile.py이

$ /usr/bin/python myfile.py 

내 하스켈 지식이 실행 해당 파일이 매우 다르지 않다 실행

#!/usr/bin/python 

가 포함되어있는 경우 및 명령 배선 최대 때문에이 파일은 해당 명령

의 인수가된다 가난한. 하지만 귀하의 특정 경우에 그것은 runghc 명령을 것 같습니다 단순히 첫 번째 라인을 읽고, 주어진 인수를 구문 분석 #! 그 파일의 나머지 부분을 임시 파일에 쓰고 그 임시 파일에서 ghc를 실행합니다 (첫 번째 유치권이 제거됩니다 - 자세한 내용은 ghc 소스의 runghc.hs를 참조하십시오).

javac에서도 runghc와 같은 접근법을 사용할 수있다. 파일의 첫 번째 줄을 먹는 래퍼를 작성하고 나머지 파일을 임시 파일에 기록한 다음 해당 파일에서 javac을 실행합니다.

+1

텍스트 파일이 표준 입력이되지 않습니다. 원본 명령 줄 (가능하면 경로 정보가 텍스트 파일의 이름에 추가됨)이 shebang 행에있는 명령에 추가됩니다. 원래의 표준 입력은 확장 된 명령의 표준 입력으로 남아 있습니다. – dave4420

+0

예, 죄송합니다. 그것을 바로 잡았다. – nos

+0

면책 조항 : 저는 자바가 거의 없다는 것을 알고 있습니다. 하지만 Java에 #foo 주석이 있습니까? * nix의 스크립팅 언어 대부분에서 (의도적으로) 알고 있으므로 첫 번째 줄을 벗기는 것에 대해 걱정할 필요가 없습니다. –

5

파일은 hello.hs이며, 첫 번째 줄 경우, 쉘이 실행됩니다 "#는/usr// runghc 빈!": 첫 번째 줄은 기본적으로 쉘 무엇을 알려줍니다

/usr/bin/runghc hello.hs 

그건 스크립트를 실행하는 데 사용하십시오.

는 자바 예를 들어, 제 라인은 실행 스크립트가 아니라 그 스크립트 컴파일하는 실행해야합니다.

+0

"terminal"대신 "shell"을 사용하면 올바르게 알 수 있습니다. – ennuikiller

+0

@ennuikiller : 거의 없습니다. – tripleee

1

만 해석 언어로 작동하는 오두막은 .... 그것은 일반적으로 대부분의 경우

0

이것이 작동하는 이유에서 오류가 발생하지 컴파일러에 아무 의미 파이썬, 펄, 그리고 분명히 하스켈 때문에, 모두 해석 된 언어. 그것은 스크립트를 실행할 인터프리터를 지정하는 표준 유닉스 방법이다. Java는 컴파일 된 언어이며 인터프리터로 실행할 수 없습니다.

0

Javac은 인터프리터가 아닌 컴파일러입니다.

'마법'을 일으키는 대화 형 모드가 없습니다. 동일한 기능이 없으므로 GCC에서 작동하지 않습니다.

예를 들어, dmd (D 컴파일러)는 인터랙션을 지원하는 컴파일러의 예입니다. 이러한 종류의 대화식 편집 (#!/usr/bin/dmd -run)이 있습니다.

0

스크립트를 해석하기 위해 컴퓨터에서 실행 파일의 위치입니다. 자바는 컴파일 된 언어이기 때문에 그러한 진술이 필요하지 않습니다.

또한 요점은 특수 주석이라는 점입니다. Java에서의 생성은 #이 법적 주석 마커가 아니기 때문에 이런 식으로 합법적이지 않습니다.

//!/usr/local/jdk1.6.0_13/bin/javac

2

제 질문은 첫 번째 줄이 무시되는 이유입니다. haskell의 주석은 -로 시작하지만 첫 번째 줄은 여전히 ​​무시 된 것처럼 보입니다. 심지어 ghci로로드됩니다. 이 트릭은 Python과 Perl에서도 작동합니다. # 그 언어로 주석을 시작, 그래서 인터프리터가 주석으로 그 라인을보고이를 무시하기 때문에

'트릭'파이썬과 펄에서 작동합니다. 그래서 그들에게는 특별하지 않습니다.

하스켈에서 #은 주석을 시작하지 않으므로 정상적으로 작동하지 않습니다. 그러나 GHC (메모리가 제공된다면 다른 구현도 가능합니다.)도 특별한 경우가 있습니다. 파일의 맨 첫 행이 #!으로 시작하면 주석으로 처리됩니다. 언어 사양과의이 편차는 정확하게 만들기 위해 통합되었습니다.

$ chmod +x hello.hs 
$ ./hello.hs 

작동합니다. 그것은 javac과 함께 작동하지 않습니다. 왜냐하면 특별한 사례가 shebang 라인에 내장되어 있지 않기 때문입니다.

관련 문제