0

当我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 的路径?

4

1 回答 1

1

首先,你的 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 不起作用,我认为这也可能被破坏。

于 2019-10-12T00:42:25.827 回答