如何在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
相关产品推荐
相关产品推荐

