通过 shebang 在 nix 中设置环境变量

Max*_*ier 6 nix

是否可以在使用通过 shebang 调用的 nix-shell 时设置环境变量?例如,我正在使用

#! /usr/bin/env nix-shell
#! nix-shell -i runghc --pure
Run Code Online (Sandbox Code Playgroud)

并想设置一个环境变量,例如FOO=bar. 注意,FOO不一定是由周围环境定义的。因此这--keep FOO不是一个选择。

Rob*_*ing 2

您似乎正在使用随附shell.nix文件。您可以简单地将环境变量定义为派生属性。

shell.nix

pkgs.mkShell {
  buildInputs = [ pkgs.ghc ];
  shellHook = ''
    VIA_SHELL_HOOK=it\ works   # no it doesn't
  '';
  VIA_DRV_ATTR = "working";
}

Run Code Online (Sandbox Code Playgroud)

可执行脚本示例

#!/usr/bin/env nix-shell
#!nix-shell -i runghc --pure

import System.Environment(getEnv)

main = do
  getEnv "VIA_DRV_ATTR" >>= print
  getEnv "VIA_SHELL_HOOK" >>= print
Run Code Online (Sandbox Code Playgroud)

输出:

"working"
hello: VIA_SHELL_HOOK: getEnv: does not exist (no environment variable)
Run Code Online (Sandbox Code Playgroud)

(Nix 2.3.4、Nixpkgs 20.03)