Обработка Shebang не согласована во всех системах [1] , но ваша система, очевидно, выполняет то, что должна выполнить следующая команда оболочки (при условии, что файл, содержащий shebang * /path/to/script
):
/usr/bin/perl -e'$_=$ARGV[0];exec(s/\w+$/python3/r,$_)' /path/to/script
(Путь к сценарию может не быть абсолютным путем - он может быть относительно текущего каталога - но здесь это не имеет значения.)
Сценарий создает /path/to/python3
из /path/to/script
(заменяя завершающие символы «слова», которые включают буквы, цифры и подчеркивание, но не /
), затем вычисляет
exec('/path/to/python3', '/path/to/script')
. Заменяет программу, выполняемую в текущем процессе, на Python интерпретатор, передавая путь к сценарию в качестве аргумента.
Если я правильно читаю между строк, вы хотите запустить /path/to/../env/bin/python3
вместо /path/to/python3
. Для этого используйте одно из следующих значений:
#!/usr/bin/perl -e$_=$ARGV[0];exec(s/\w+$/..\/env\/bin\/python3/r,$_)
или
#!/usr/bin/perl -e$_=$ARGV[0];exec(s{\w+$}{../env/bin/python3}r,$_)
/
необходимо экранировать с помощью \
, когда /
используется в качестве разделитель (первое решение), но мы можем изменить разделитель для получения более читабельного результата (второе решение).
Тот шебанг, который вы представили, вызывает поглощение аргументов. Замените $_
на @ARGV
, чтобы передать их.
#!/usr/bin/perl -e$_=$ARGV[0];exec(s{\w+$}{../env/bin/python3}r,@ARGV)
- По крайней мере, исторически, некоторые системы рассматривают всю последовательность, которая следует за
#!
, как путь (т.е. нет аргументы позволяют), а некоторые имеют очень строгие ограничения на длину пути.