如何在 nixos 上获取 /bin/bash

Jul*_*ath 3 nixos

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

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

ter*_*don 5

标准 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
Run Code Online (Sandbox Code Playgroud)

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

/usr/xpg4/bin/sh
Run Code Online (Sandbox Code Playgroud)

此外,在支持可执行脚本(“#!”构造)的系统上,建议使用可执行脚本的应用程序使用 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
Run Code Online (Sandbox Code Playgroud)

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

  • @VladimírČunát 你为什么要这么做?sh 不是 bash,那么为什么你要把它当作 bash 呢?OP 已经知道如何获得 sh shell,问题是如何获得 bash。无论如何,如果您尝试运行不可移植的 bash 脚本,这种方法将不起作用。 (2认同)