当我which bash
在 NixOS 上做时,我得到:
/run/current-system/sw/bin/bash
但我收到此错误:
env: 无法执行 'bash': 没有这样的文件或目录
这肯定是因为使用了 hashbang:
#!/usr/bin/env bash
我试过这个:
export PATH="/run/current-system/sw/bin:$PATH"
但这没有帮助。任何人都知道我怎样才能env
识别 bash 的路径?
首先,你的 shebang 应该真的有效。我已经使用这个确切的 shebang 在 NixOS 中编写了一堆临时脚本,没有任何问题。事实上,这个用例是开发人员首先投入的原因env
(/usr/bin
没有其他二进制文件存在于此)。
它不工作的事实很奇怪,可能是由于您的系统包中的某些内容。您是否尝试/usr/bin/env bash
过从 cmdline 运行以查看会发生什么?
作为旁注,默认情况下你PATH
应该已经包含/run/current-system/sw/bin
,如果没有,你手上有一个更大的问题。这是configuration.nix
安装您定义的所有软件的符号链接的地方。
解决方法
但是,如果您现在需要它来工作并且没有时间弄清楚根本原因是什么,那么有一种解决方法可以直接明确声明 bash 二进制文件的完整路径。您可以将脚本包装在 nix 表达式中。这是一个简单shell.nix
的符号链接,它为您提供了驻留在 nix-store 中的脚本的符号链接,该脚本在其 shebang 中具有 bash 的完整路径:
{ pkgs ? import <nixpkgs> {} }:
let
script = pkgs.writeScript "myscript.sh" script_;
script_ = ''
#!${pkgs.bash}/bin/bash
echo hello world
'';
in
pkgs.mkShell {
shellHook = ''
ln -s ${script} myscript
'';
}
这不是最好的解决方案,但它会让您立即启动并运行。你也可以在你的 configuration.nix 中做一些非常相似的事情。
我会推荐nix-shell shebangs作为更好的解决方案,但是由于您原来的 shebang 不起作用,我认为这也可能被破坏。