Может ли 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",...)
.