Может ли скрипт использоваться как интерпретатор #!линия хэшбанга? - PullRequest
10 голосов
/ 09 июля 2011

Я пытаюсь написать bash-скрипт, который будет вести себя как базовый интерпретатор, но, похоже, он не работает: пользовательский интерпретатор, похоже, не вызывается. Что я делаю не так?

Вот простая настройка, иллюстрирующая проблему:

/bin/interpreter: [принадлежит root; Исполняемый]

#!/bin/bash

echo "I am an interpreter running " $1

/Users/zeph/script принадлежит мне и является исполняемым:

#!/bin/interpreter

Here are some commands for the custom interpreter.

Из того, что я понимаю о механизме hashbangs, скрипт должен быть выполнен следующим образом:

$ ./script
I am an interpreter running ./script

Но это не работает. Вместо этого происходит следующее:

$ ./script 
./script: line 3: Here: command not found

... Похоже, что /bin/bash пытается интерпретировать содержимое ./script. Что я делаю не так?

Примечание. Несмотря на то, что /bin/interpreter никогда не вызывалось, я делаю получаю сообщение об ошибке, если его не существует:

$ ./script
-bash: ./script: /bin/interpreter: bad interpreter: No such file or directory

(Второе примечание: если это что-то меняет, я делаю это на MacOS X).

Ответы [ 4 ]

9 голосов
/ 10 июля 2011

Чтобы сделать это, вы можете добавить интерпретатор переводчика (т.е. bash) к шебангу:

#!/bin/bash /bin/interpreter

Here are some commands for the custom interpreter.

bash затем запустит ваш интерпретатор с путем к сценарию в $1, как и ожидалось.

6 голосов
/ 10 июля 2011

Вы не можете использовать скрипт напрямую в качестве #! интерпретатора, но вы можете запустить скрипт косвенно с помощью команды env, используя:

    #!/usr/bin/env /bin/interpreter

/usr/bin/env сам по себе является двоичным файлом, поэтому является допустимым интерпретатором для #!/bin/interpreter может быть чем угодно (сценарием любого типа или бинарным) без необходимости вкладывать знания своего интерпретатора в вызывающий сценарий.

4 голосов
/ 10 июля 2011

Прочтите справочную страницу execve для вашей системы. Он диктует, как запускаются сценарии, и должен указывать, что интерпретатор в строке хэш-бэнг является двоичным исполняемым файлом.

0 голосов
/ 11 июля 2011

Я задал аналогичный вопрос в comp.unix.shell , который поднял некоторую уместную информацию.

Была вторая ветвь того же потока , которая продолжила идею.

Самое общее решение для Unix - иметь указатель Шебанга на двоичный исполняемый файл. Но эта исполняемая программа может быть такой же простой, как один вызов execl(). Оба потока приводят в качестве примера исходный код C для программы с именем gscmd, которая является чуть более, чем оболочкой для execv("gs",...).

...