Introspect nix-shell?

From inside a running nix-shell, is there a way to inspect the derivation that launched it?

For example, if I launched it from a file, I could check the version attr with:

nix-instantiate --eval --attr version /path/to/file

But that’s assuming I know /path/to/file, and assuming there even is a file. I could’ve launched the shell using --packages instead…

Is there a way you can reliably reference the shell’s derivation from within that shell?

1 Like

No. Derivation know nothing about expression it was generated from.

However, not all is lost. For example, many things are exposed as envvar!

$ # $version would work too if it had been defined 
$ nix-shell '<nixpkgs>' -A mercurial --run 'echo $name'
mercurial-4.7.1

mkDerivation attributes are exposed as envvars. Like this:

$ nix-shell -p mercurial git --run 'echo $buildInputs'
/nix/store/0x53zl7psb03352nhwlpyd8bqvqsd97b-mercurial-4.7.1 /nix/store/qcn9ck2zfk9bj5m3g1jv0lcc9yicjq2j-git-2.19.1

I’d wish realized derivation know it’s originating .drv file. In some cases it is possible to get this information from nix DB:

$ nix-shell -p sqlite

[nix-shell] $ sudo sqlite3 "/nix/var/nix/db/db.sqlite" \
      "select deriver from ValidPaths where path = '$buildInputs'"
/nix/store/x5g0bbjf00x8944mna1rwj1bpjk95rjv-sqlite-3.24.0.drv

And drv can be inspected:

$ nix-shell -p jq
$ nix show-derivation /nix/store/x5g0bbjf00x8944mna1rwj1bpjk95rjv-sqlite-3.24.0.drv \
  | jq ....

Unfortunately, nix DB doesn’t contain all backwards mappings store path → derivation, so this method isn’t reliable too.

2 Likes

Awesome! I totally overlooked that, and it’s a lot simpler to just echo $version