所以我知道我可以将 she-bangs 更改为,#!/usr/bin/env bash
并且我将为我的脚本执行此操作,但实际上我希望能够使用#!/bin/bash
she-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
'';
};