You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在shell.nix中指定nix-shell的--command参数?

解决shell.nix中替代nix-shell --command的问题

核心解决方案:用exec替换当前Shell进程

你遇到的问题根源是yarn dev作为shellHook的子进程运行,终止后会停留在nix-shell的bash环境里。要实现和--command完全一致的效果(命令终止后直接回到原Shell),关键是让yarn dev替换当前的Shell进程,而非作为子进程启动。

修改后的shell.nix配置如下:

{ pkgs ? import <nixpkgs> {} }:

pkgs.mkShell {
  packages = with pkgs; [
    nodejs_22
    yarn
  ];

  shellHook = ''
    # 用exec替换当前shell进程,终止yarn后直接退出到原shell
    exec yarn dev
  '';
}

方案说明

  • exec命令会用指定程序(这里是yarn dev)替换当前的Shell进程,而非创建子进程。当你用Ctrl+C终止yarn dev时,整个进程直接结束,自然回到原Shell环境。
  • 无需手动修改PATH,mkShell会自动将packages列表中工具的bin目录加入环境变量,原配置里的export PATH属于冗余操作。

备选方案:直接编写启动脚本

如果上述方式不符合你的预期,确实可以直接写一个简单的bash脚本替代。比如创建dev.sh文件:

#!/usr/bin/env bash
nix-shell -p nodejs_22 yarn --command "yarn dev"

给脚本添加执行权限:chmod +x dev.sh,之后直接运行./dev.sh即可。

内容的提问来源于stack exchange,提问作者Simao Gomes Viana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 16:08:15