Если я хочу выполнить bash-скрипт, для которого не установлено разрешение на выполнение, я могу сделать:
bash script.sh
Что я должен использовать вместо, bash
если скрипт не является исполняемым, и я не знаю правильный интерпретатор? Есть ли команда, которая ищет интерпретатор из строки shebang и выполняет сценарий вместе с ним?
bash whatever
работает, зачем использовать что-то другое? bash доступен практически на всех * ix системах, так что зачем ...Ответы:
Ага. Это называется
perl
:Это упоминается в документации Perl :
источник
.js
тоже работает?#!
. Я, кажется, немногим больше, и не сталкивался с этой проблемой.man perlrun
застенчиво признает, что это "немного странно" :). Я думаю, что это следует рассматривать как любопытство, направленное на не-UNIX среды и очень очень старые версии UNIX.Сценарии не обязательно имеют шебанг
Если скрипт был запущен от переводчика, Вы не можете быть уверены, что он имеет шебанг вообще . Скрипты, запускаемые из интерпретатора, не нуждаются в шебанге , если вы вызываете интерпретатор для запуска кода.
Таким образом, ответ - нет, нет команды, которая бы точно знала, на каком языке (интерпретаторе) запускать скрипт. Однако вы всегда можете заглянуть внутрь сценария и посмотреть, есть ли у него шебанг, чтобы узнать.
Правила вкратце:
Однако, если в сценарии нет шебанга, в сценарии нет (прямой *) информации, указывающей, какой интерпретатор использовать.
Было сказано, что
Конечно, вы всегда можете написать скрипт-обертку, чтобы попытаться выяснить, есть ли у скрипта шебанг, и прочитать интерпретатор из него, а затем запустить его из найденного интерпретатора.
Пример
Сохраните его как
tryrun
в$PATH
(например~/bin
, сделайте каталог, если он не существует, выйдите из системы и войдите обратно), сделайте его исполняемым . Затем работает:вызывает (проверял) правильный интерпретатор моих неисполняемых файлов
python
иbash
скриптов.объяснение
#!
и использует остальное для вызова интерпретатора.PermissionError
либо aFileNotFoundError
.Запись
Расширение (
.sh
и.py
т. Д.) Не играет никакой роли при определении соответствующего интерпретатора в Linux.(* Конечно, можно разработать «умный» алгоритм предположения для определения синтаксиса из кода.)
источник
Вы можете достичь этого с помощью скрипта, подобного этому:
Таким образом:
Я рекомендую не делать этого. Разрешения есть по причине. Это программа для подрыва разрешений.
Обратите внимание, что обработка shebang - это функция ядра (в исходном коде Linux -
fs/binfmt_script.c
). По сути, процесс, вызывающий скрипт напрямую, не знает о#!
- ядро использует его, чтобы выяснить, что ему нужно запустить интерпретатор.источник