2009-07-14 4 views
14

я могу сделать что-то подобное в Haskell:Что означает #!/Usr/bin/... в начале файла?

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

Тогда я могу запустить его с ./hello.hs

Мой вопрос, почему это первая строка игнорируется? Комментарии в haskell начинаются с --, но первая строка по-прежнему кажется проигнорированной. Он даже загружается в ghci. Трюк также работает с Python и Perl.

Но когда я делаю что-то подобное в Java:

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

Javac дает мне ошибку компилятора.

Как это работает и как я могу заставить его работать с Java?

Спасибо.

+0

Возможный дубликат [Почему люди пишут #!/Usr/bin/env python в первой строке скрипта Python?] (Http://stackoverflow.com/questions/2429511/why-do-people-write -usr-bin-env-python-on-the-first-line-of-a-python-script) –

ответ

15

#! называется «shebang» и является способом выполнения сценариев Unix. Когда вы попросите ОС выполнить файл, выяснится, что это не обычный файл .exe, а #! в начале служит волшебным маркером, который инструктирует ОС выполнить команду после #!и подключение до приказывают поэтому этот файл становится аргументом этой команды

если myfile.py содержит

#!/usr/bin/python 

выполнения, что файл не сильно отличается от работы

$ /usr/bin/python myfile.py 

Моих Haskell знания бедные. Но для вашего конкретного случая кажется, что команда runghc просто читает первую строку, анализирует любые аргументы, данные на этом #! line, записывает остальную часть файла во временный файл и запускает ghc в этом временном файле (который будет иметь первое залоговое удержание - см. runghc.hs в источниках ghc для получения дополнительной информации.)

Если вы хотите сделайте то же самое с javac, вы можете использовать тот же подход, что и runghc. Напишите оболочку, которая ест первую строку файла, записывает остальную часть файла в файл temp и запускает javac в этом файле.

+1

Текстовый файл не становится стандартным вводом. Исходная командная строка (возможно, с информацией о пути, добавленной к имени текстового файла) добавляется к команде, найденной на линии shebang. Исходный стандартный ввод остается стандартным вводом расширенной команды. – dave4420

+0

Да, извините. исправил это. – nos

+0

Отказ от ответственности: Я знаю немного Java. Но есть #foo комментарий в Java? Я знаю, что это (специально) на большинстве языков сценариев на * nix, так что вам не нужно беспокоиться о том, чтобы удалить первую строку. –

5

Если файл hello.hs, и первая линия, то оболочка будет выполнять «#/USR/бен/runghc!»:

/usr/bin/runghc hello.hs 

Это первая линия в основном говорит оболочке, что в используйте для запуска скрипта.

Что касается примера Java, первая строка должна быть исполняемый файл, который запускается сценарий, не то, что компилирует сценарий.

+0

заменить «оболочку» для «терминала», и вы получили ее правильно – ennuikiller

+0

@ennuikiller: вряд ли. – tripleee

1

притон работает только с интерпретируемых языков .... это вообще ничего не значит для компилятора, который будет ошибка в большинстве случаев

0

Причина, по которой это работает, потому что Python, Perl, и, очевидно Haskell, все интерпретируемых языков. Это стандартный способ Unix для обозначения интерпретатора, который будет запускать скрипт. Java - это скомпилированный язык и не может работать с интерпретатором.

0

Javac - это компилятор, а не переводчик.

Не хватает интерактивного режима, который, я считаю, вызывает магию. То же самое не будет работать с GCC, так как в нем отсутствует такая же функция.

dmd (компилятор D), например, является примером компилятора, который поддерживает интерпертацию, имеет такое интерактивное редактирование (#!/Usr/bin/dmd -run).

0

Это место исполняемого файла на вашем компьютере для интерпретации вашего сценария. Java - это скомпилированный язык, поэтому ему не нужен такой оператор.

Кроме того, дело в том, что это специальный комментарий, конструкция на Java не будет легальной, так как # не является маркером комментариев. Если конструкция как это имело бы смысл ... что это не ... это будет выглядеть так:

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

2

Мой вопрос: почему первая строка игнорируется? Комментарии в haskell начинаются с - но первая строка по-прежнему кажется проигнорированной. Он даже загружается в ghci. Трюк также работает с Python и Perl.

Основная хитрость работает в Python и Perl, потому что # начинает комментарий на этих языках, так что интерпретатор видит эту строку в качестве комментария и игнорирует его. Для них это ничего особенного.

В Haskell # не добавляет комментариев, поэтому обычно это не работает. Тем не менее, GHC (возможно, также и другие реализации, если память служит, объятия тоже сделали) имеет специальный случай для строк shebang. Если первая строка файла начинается с #!, это рассматривается как комментарий. Это отклонение от спецификации языка было введено точно, чтобы произвести

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

работа. Он не работает с javac, потому что в него нет специального случая для линий shebang.

 Смежные вопросы

  • Нет связанных вопросов^_^