Вопрос или проблема
Итак, я знаю, что могу изменить шебанг на #!/usr/bin/env bash
и сделаю это для своих скриптов, но на самом деле мне хотелось бы иметь возможность запускать множество скриптов с #!/bin/bash
шебангом. Иногда это легко изменить, иногда нет, потому что скрипт запускается каким-то другим процессом, а не вами напрямую, и находится в месте, до которого вы не хотите прикасаться.
Существует ли какая-то опция, которую я могу активировать в конфигурации системы, чтобы получить ссылку на /bin/bash
? И есть ли какие-то причины, по которым я не должен этого хотеть? Почему это не стандарт? (Пожалуйста, не говорите мне что-то о скользком склоне, /bin/bash
вероятно является одним из самых распространенных предположений о системе Unix)
Стандартная оболочка POSIX — это sh
, а не bash
. Поэтому вы можете предположить, что системы POSIX будут иметь оболочку, совместимую с bourne, доступную и названную sh
, но нет никаких причин предполагать, что у них будет установлен bash
, и тем более, что он будет находиться по адресу /bin/bash
. На самом деле, спецификация POSIX даже не требует, чтобы sh
находился по пути /bin/sh
:
Приложения должны учитывать, что стандартный PATH для оболочки не может
предполагаться как /bin/sh или /usr/bin/sh и должен определяться
путем допроса PATH, возвращаемого getconf PATH, чтобы обеспечить,
что возвращаемое имя пути является абсолютным именем пути, а не встроенной
оболочкой.Например, чтобы определить местоположение стандартного утилита sh:
command -v sh
На некоторых реализациях это может вернуть:
/usr/xpg4/bin/sh
Кроме того, на системах, которые поддерживают исполняемые скрипты (конструкция “#!”),
рекомендуется, чтобы приложения, использующие исполняемые
скрипты, устанавливали их с помощью getconf -v для определения имени пути оболочки
и обновляли “#!” скрипт соответственно в процессе установки (например, с помощью sed).
Таким образом, причина, по которой /bin/bash
не является стандартом, заключается в том, что bash
не является стандартом. Именно поэтому существует env
и почему #!/usr/bin/env bash
является портативным решением для этого типа задач.
Тем не менее, если это ваша система, то вам решать. Нет никаких причин не добавлять символическую ссылку в /bin/bash
, указывающую на то место, где установлен ваш bash
. Если ваш bash
находится, например, в /usr/bin
, вы можете просто открыть shell с правами root и выполнить:
ln -s /usr/bin/bash /bin/bash
Если вы владеете системой или согласуете это с местным системным администратором, в этом не должно быть проблем.
На данный момент стандартная оболочка на NixOS — Bash. Предполагая, что вы это не меняли, вы можете сделать следующее в /etc/nixos/configuration.nix
.
system.activationScripts.binbash = {
deps = [ "binsh" ];
text=""
ln -s /bin/sh /bin/bash
'';
};
2024 Я считаю, что правильный путь — это:
services.envfs.enable = true;
Файловая система Fuse, которая возвращает символические ссылки на исполняемые файлы на основе PATH запрашивающего процесса. Это полезно для выполнения шебангов на NixOS, которые предполагают жёстко закодированные местоположения в таких каталогах, как /bin или /usr/bin и т.д.
Ответ или решение
Как получить /bin/bash на NixOS
Введение
Вопрос, как запустить скрипты с шебангом #!/bin/bash
на системе NixOS, стоит перед многими пользователями, которые стремятся к простоты и универсальности в исполнении сценариев. В NixOS, который придерживается своей уникальной философии управления пакетами и конфигурациями, может показаться, что выполнение скриптов с таким шебангом является сложной задачей. Тем не менее, существуют способы, позволяющие достичь этой цели без особых усилий.
Почему это важно
Ключевым моментом является тот факт, что в Unix-системах приемлемыми являются различные шебанги, начиная от /bin/sh
(стандартный POSIX шелл) и заканчивая /bin/bash
(Bourne Again Shell). Однако не всегда возможно изменить шебанг во всех скриптах, особенно если они запускаются другими процессами или находятся под управлением различных систем. Наличие доступа к /bin/bash
решает проблему, не нарушая работу существующих скриптов.
Как создать символьную ссылку на /bin/bash в NixOS
-
Изменение конфигурации системы:
Если вы не настраивали оболочку по умолчанию в NixOS, и ваша система использует Bash, вы можете сделать следующее. Откройте файл конфигурации NixOS, который находится по пути/etc/nixos/configuration.nix
, и добавьте следующий фрагмент кода:system.activationScripts.binbash = { deps = [ "binsh" ]; text = '' ln -s /usr/bin/bash /bin/bash ''; };
Здесь мы создаем символьную ссылку, которая указывает на местоположение вашего Bash. Это позволит вам запускать скрипты с шебангом
#!/bin/bash
. -
Пересборка конфигурации системы:
После внесения изменений в конфигурацию необходимо пересобрать систему с помощью команды:sudo nixos-rebuild switch
Эта команда активирует изменения и применит новую конфигурацию.
Использование envfs
Если вы используете версию NixOS 2024 или более позднюю, то существует еще один способ сделать работу с шебангом более гибкой – это использование функции envfs
. Для этого, укажите в вашем configuration.nix
:
services.envfs.enable = true;
envfs
– это файловая система, использующая FUSE, которая возвращает символьные ссылки на исполняемые файлы, основываясь на PATH
запрашивающего процесса. Таким образом, это позволяет запускать скрипты, которые предполагают наличие исполняемых файлов в традиционных местах, таких как /bin
или /usr/bin
.
Преимущества установки /bin/bash
- Совместимость: Большинство скриптов ожидают наличие Bash в стандартных местах, поэтому наличие
/bin/bash
обеспечивает совместимость с множеством сценариев и приложений. - Упрощение работы: Установка
/bin/bash
позволяет избежать постоянной необходимости редактировать шебанги на скриптах, что экономит время и силы при запуске различных скриптов в среде постоянного изменения. - Гибкость: Вы можете настроить систему таким образом, чтобы она отвечала вашим специфическим нуждам, не полагаясь на внешний пакетный менеджер или дополнительные зависимости.
Заключение
Создание символьной ссылки /bin/bash
на NixOS — это эффективный и простой метод обеспечения совместимости между скриптами и системой. Важно помнить, что, хотя использование #!/usr/bin/env bash
является более переносимым решением в долгосрочной перспективе, добавление конкретного шебанга может упростить текущую работу. Также, рассматривая использование envfs
, вы получаете дополнительные функции, расширяющие возможности управления исполняемыми файлами в среде NixOS.
При соблюдении вышеуказанных рекомендаций, вы сможете без проблем запускать свои скрипты с шебангом #!/bin/bash
, облегчая процесс разработки и эксплуатации.