【问题标题】:add bash so that it's recognized by /usr/bin/env添加 bash 使其被 /usr/bin/env 识别
【发布时间】:2020-01-07 18:33:24
【问题描述】:

当我在 NixOS 上执行 which bash 时,我得到:

/run/current-system/sw/bin/bash

但我收到此错误:

env: 无法执行 'bash': 没有这样的文件或目录

这肯定是因为使用了 hashbang:

#!/usr/bin/env bash

我试过了:

export PATH="/run/current-system/sw/bin:$PATH"

但这并没有帮助。有人知道我如何让env 识别 bash 的路径吗?

【问题讨论】:

  • export 命令应该可以工作。
  • 你把它放在你的.bash_profile.profile 所以每次登录都会执行吗?
  • @Barmar: 如果$PATH 已经是一个导出变量,通常情况下甚至不需要重新导出它
  • @ArkadiuszDrabczyk 但是再出口没有坏处。我的意思是分配给$PATH 应该可以工作,只要他每次登录时都执行它。

标签: bash shell nixos nix-shell


【解决方案1】:

首先,你的 shebang 应该确实有效。我已经使用这个确切的 shebang 在 NixOS 中编写了一堆临时脚本,没有任何问题。事实上,这个用例是开发人员首先将env 放在/usr/bin 中的原因(那里没有其他二进制文件)。

它不工作的事实很奇怪,可能是由于您的系统包中的某些东西。您是否尝试过从 cmdline 运行 /usr/bin/env bash 看看会发生什么?

附带说明一下,默认情况下,您的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 不起作用,我认为这也可能被破坏。

【讨论】:

    猜你喜欢
    • 2014-03-03
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 2011-11-28
    相关资源
    最近更新 更多