Intereting Posts
Поддерживать приложения Xserver, даже после закрытия удаленной консолидации Как сделать запись Slackware в grub2 Режим vi не отображается корректно на новом терминале Есть ли способ предотвратить удаление определенных файлов из пользовательской директории? Есть ли способ конвертировать избранное IE в формат bookmark.htm Firefox? Разблокируйте зашифрованные тома после перезапуска сервера через SSH Ошибка Docker dns Обновление меню KDE в Монетном дворе без выхода из системы Низкая (?) Энтропия доступна в Arch Linux? Как отключить файл, символически привязанный к себе, без разрушения Что делают поля «buff / cache» и «avail mem» в верхней части? Не удается получить доступ к SSH-серверу, работающему в WSL Система полностью замораживается при использовании HDMI Это хорошая идея для фильтрации ввода перед запуском awk-действия? У клиента MariaDB нет приглашения в SQL-режиме Emacs

Как вы указываете альтернативные интерпретаторы сценариев (shebangs)?

В исполняемом файле вы указываете среду с помощью shebang:

#!/usr/bin/env ruby # ruby code here 

Но что, если вы хотите указать несколько возможных сред? Например, если у вас несколько версий Ruby, вы можете сделать что-то вроде

 #!/path/to/better/ruby/version #!/path/to/alternative/ruby/version # ruby code here 

Как вы можете указать несколько возможных сред для одного исполняемого файла?

Короткий ответ заключается в том, что вы не можете.

Идея использования #!/usr/bin/env ruby вместо простого #!/usr/bin/ruby заключается в том, чтобы использовать любой Ruby-бинарный файл сначала по пути пользователя. Тогда ваш скрипт не зависит от того, как рубин находится в одном месте в каждой системе; в конце концов, «нормальное» рубиновое местоположение может быть /usr/bin/ruby , /usr/local/bin/ruby , /opt/ruby-1.8.7/bin/ruby и т. д. …

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

 #!/bin/sh for ruby in /usr/bin/ruby /usr/local/bin/ruby do if [ -x "$ruby" ] then "$ruby" myscript.rb break fi done 

И если вы достаточно мотивированы, вы можете даже встроить скрипт ruby ​​(или другой) в сценарий оболочки.

Я буду противоречить mrb и скажу, что вы можете делать альтернативы, не меняя «#!» линия.

Предположим, что у вас есть рубиновый скрипт с #!/usr/bin/env ruby в качестве первой строки.

Вы хотите /path/to/better/ruby/version/whatever от запуска сценария, вы задаете переменную среды PATH: сначала /path/to/better/ruby/version :

 PATH=/path/to/better/ruby/version:$PATH whatever_script_name_is 

Вы хотите /usr/local/bin/ruby запустить сценарий? Установите PATH соответствующим образом:

 PATH=/usr/local/bin:$PATH whatever_script_name_is 

Обратите внимание, что возиться с PATH может вызвать другие проблемы в том случае, если исполняемый файл ruby, который вы хотите запустить, находится в том же каталоге с другими альтернативными программами. Например, если /usr/local/bin имеет BSD cat , grep , sed в нем, а также ruby , то при установке PATH=/usr/local/bin:$PATH вы получите исполняемые файлы BSD вместо исполняемых файлов Linux. Это может вызвать проблемы.