如何在 nixos 上获取 /bin/bash

如何在 nixos 上获取 /bin/bash

所以我知道我可以将 she-bangs 更改为,#!/usr/bin/env bash并且我将为我的脚本执行此操作,但实际上我希望能够使用#!/bin/bashshe-bang 运行许多脚本。有时很容易更改,有时则不然,因为脚本是由其他东西运行的,而不是由您直接运行,并且它位于您真正不想触及的地方。

我可以在系统配置中启用一些选项来获取链接/bin/bash,还有什么原因我不应该这样做,为什么这不是标准? (请不要告诉我有关滑坡的事情,/bin/bash这可能是对 Unix 系统最常见的假设之一)

答案1

标准 POSIX shell 是sh,不是bash。因此,您可以假设 POSIX 系统将有一个可用且名为 的 bourne 兼容 shell sh,但没有理由假设它们已经bash安装,也没有理由假设它会位于/bin/bash。实际上,POSIX 规范sh甚至不需要/bin/sh

应用程序应注意,shell 的标准 PATH 不能假定为 /bin/sh 或 /usr/bin/sh,并且应通过询问 getconf PATH 返回的 PATH 来确定,确保返回的路径名是绝对路径名路径名而不是内置的 shell。

例如,要确定标准 sh 实用程序的位置:

command -v sh

在某些实现上,这可能会返回:

/usr/xpg4/bin/sh

此外,在支持可执行脚本(“#!”构造)的系统上,建议使用可执行脚本的应用程序使用 getconf -v 来安装它们,以确定 shell 路径名并更新“#!”在安装时适当地编写脚本(例如,使用 sed)。

所以不标准的原因/bin/bash就是bash不标准。这正是env存在的原因和#!/usr/bin/env bash存在的原因便携式解决方案对于这种事情。

也就是说,如果这是您的系统,那完全取决于您。没有理由不添加一个符号链接来/bin/bash指向您的bash安装位置。例如,如果您bash位于/usr/bin,您只需打开 root shell 并运行:

ln -s /usr/bin/bash /bin/bash

只要您拥有该系统,或者您通过本地系统管理员清除了该系统,就应该没有问题。

答案2

目前 NixOS 上的默认 shell 是 Bash。假设您没有更改,那么您可以在 中执行以下操作/etc/nixos/configuration.nix

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

相关内容