如何使用其他非永久别名启动 ZSH shell 会话?

How to start a ZSH shell session with additional non-permanent aliases?

我在 NixOS I've added rabbitmq-server in a shell.nix, and need to pass the paths to its binaries to pytest as command line arguments so the pytest-rabbitmq 上默认使用 ZSH shell 插件可以找到它们。

为此,我希望能够使用包含所需参数的 pytest 别名启动 ZSH:

{ pkgs ? import <nixpkgs> { } }:
(
  let rabbitmq_bin = "${builtins.toString pkgs.rabbitmq-server}/bin"; in
  pkgs.mkShell {
    buildInputs = [
      pkgs.python39Packages.pytest
      # ... (Python environment details omitted for brevity)
      pkgs.rabbitmq-server
    ];
    shellHook = "
      alias pytest=\"pytest \
        --rabbitmq-server ${rabbitmq_bin}/rabbitmq-server \
        --rabbitmq-ctl ${rabbitmq_bin}/rabbitmqctl\"
    ";
  }
)

我可以在 shellHook 中添加一个 zsh 调用,但我一直无法找到一种方法来指示它初始化别名。

我考虑过的解决方案:

nix-shell/nix develop 最初是为调试 Nixpkgs stdenv-based 构建的特定用例而设计的,它使用 bash.

如果您想支持不同的 shell,我会 recommend 创建自定义 shell 启动器脚本,您可以 运行 使用 nix run.这为您提供了所需的所有灵活性。也就是说,假设您可以使用实验性功能。 否则,您可以创建一个脚本来填补 nix run 的空白:运行ning nix-buildexec-ing 其结果,即您的自定义 shell 启动器.

或者,您可以生成一个脚本 source-d.

# zsh-functions.nix
{ pkgs ? import <nixpkgs> {} }:
let
  inherit (pkgs) lib;
in
pkgs.writeText "functions.zsh" ''
  PATH=${lib.makeBinPath [pkgs.hello]}:$PATH
  hi(){
    hello
  }
''
zsh% eval "source $(nix-build zsh-functions.nix)"