如何不打开shell查看nix shell内的PATH?为何当前方法无效?
问题原因及解决办法
核心原因
你遇到的问题是shell变量展开时机导致的:当你执行nix shell github:nixos/nixpkgs/nixpkgs-unstable#hello --command echo $PATH时,你的当前shell(比如bash、zsh)会先把$PATH解析成当前环境的PATH值,再把这个已经展开的字符串传给nix shell的--command参数。也就是说,echo打印的是你当前shell的PATH,而非nix shell环境里的PATH,自然看不到hello所在的目录。
解决办法
有两种简单的方式可以拿到nix shell环境内的PATH:
用单引号包裹命令,阻止当前shell提前展开变量:
nix shell github:nixos/nixpkgs/nixpkgs-unstable#hello --command 'echo $PATH'这样
$PATH会在nix shell启动的环境中被解析,就能看到包含hello可执行文件目录的PATH了。通过子shell执行命令,明确让变量在目标环境中展开:
nix shell github:nixos/nixpkgs/nixpkgs-unstable#hello --command sh -c 'echo $PATH'
如果要验证差异,对应的diff命令也要改成:
diff <(echo $PATH) <(nix shell github:nixos/nixpkgs/nixpkgs-unstable#hello --command 'echo $PATH')
内容的提问来源于stack exchange,提问作者Pierre-olivier Gendraud
相关产品推荐
相关产品推荐

