bill and his blog

nix-shell (note to self)


I rarely use nix-shell for its originally intended purpose of "reproducing the environment of a derivation for development". Instead, I often use it to put some executable on my PATH for some ad hoc task.

What's nix-shell's "intended purpose"? Let's ask The Man (man nix-shell):

The command nix-shell will build the dependencies of the specified derivation, but not the derivation itself. It will then start an interactive shell in which all environment variables defined by the derivation path have been set to their corresponding values, and the script $stdenv/setup has been sourced. This is useful for reproducing the environment of a derivation for development.

Because I'm abusing nix-shell in this way, I'm liable to forget that nix-shell puts buildInputs on PATH and not the derivation itself. But I often only want the derivation!


Pass the Nix expression to nix-shell -p:

λ nix-shell -p '(import /depot {}).tvix.eval'


This works because Nix forwards the arguments passed to -p (i.e. --packages) and interpolates them into this expression here: source

{ ... }@args:

with import <nixpkgs> args;

(pkgs.runCommandCC or pkgs.runCommand) "shell" {
  buildInputs = [
    # --packages go here

So really you can pass-in any valid Nix expression that produces a derivation and nix-shell will put its outputs on your PATH.