Может ли script использоваться в качестве интерпретатора с помощью #! линия hashbang?

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

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

/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 должен быть выполнен следующим образом:

$ ./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).

Ответ 1

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

#!/bin/bash /bin/interpreter

Here are some commands for the custom interpreter.

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

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