Как получить /bin/bash на NixOS

Вопрос или проблема

Итак, я знаю, что могу изменить шебанг на #!/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

  1. Изменение конфигурации системы:
    Если вы не настраивали оболочку по умолчанию в NixOS, и ваша система использует Bash, вы можете сделать следующее. Откройте файл конфигурации NixOS, который находится по пути /etc/nixos/configuration.nix, и добавьте следующий фрагмент кода:

    system.activationScripts.binbash = {
     deps = [ "binsh" ];
     text = ''
       ln -s /usr/bin/bash /bin/bash
     '';
    };

    Здесь мы создаем символьную ссылку, которая указывает на местоположение вашего Bash. Это позволит вам запускать скрипты с шебангом #!/bin/bash.

  2. Пересборка конфигурации системы:
    После внесения изменений в конфигурацию необходимо пересобрать систему с помощью команды:

    sudo nixos-rebuild switch

    Эта команда активирует изменения и применит новую конфигурацию.

Использование envfs

Если вы используете версию NixOS 2024 или более позднюю, то существует еще один способ сделать работу с шебангом более гибкой – это использование функции envfs. Для этого, укажите в вашем configuration.nix:

services.envfs.enable = true;

envfs – это файловая система, использующая FUSE, которая возвращает символьные ссылки на исполняемые файлы, основываясь на PATH запрашивающего процесса. Таким образом, это позволяет запускать скрипты, которые предполагают наличие исполняемых файлов в традиционных местах, таких как /bin или /usr/bin.

Преимущества установки /bin/bash

  1. Совместимость: Большинство скриптов ожидают наличие Bash в стандартных местах, поэтому наличие /bin/bash обеспечивает совместимость с множеством сценариев и приложений.
  2. Упрощение работы: Установка /bin/bash позволяет избежать постоянной необходимости редактировать шебанги на скриптах, что экономит время и силы при запуске различных скриптов в среде постоянного изменения.
  3. Гибкость: Вы можете настроить систему таким образом, чтобы она отвечала вашим специфическим нуждам, не полагаясь на внешний пакетный менеджер или дополнительные зависимости.

Заключение

Создание символьной ссылки /bin/bash на NixOS — это эффективный и простой метод обеспечения совместимости между скриптами и системой. Важно помнить, что, хотя использование #!/usr/bin/env bash является более переносимым решением в долгосрочной перспективе, добавление конкретного шебанга может упростить текущую работу. Также, рассматривая использование envfs, вы получаете дополнительные функции, расширяющие возможности управления исполняемыми файлами в среде NixOS.

При соблюдении вышеуказанных рекомендаций, вы сможете без проблем запускать свои скрипты с шебангом #!/bin/bash, облегчая процесс разработки и эксплуатации.

Оцените материал
Добавить комментарий

Капча загружается...