Suppose I search for a package to install using nix-env's --query operation:

$ nix-env -qa 'aspell.*en'

I write this package name in /etc/nixos/configuration.nix, NixOS's main configuration file:

environment.systemPackages = with pkgs; [

Yet if I run sudo nixos-rebuild switch, NixOS command to update the configuration and install all system-wide packages specified by declaratively, it aborts with an error:

error: undefined variable ‘aspell-dict-en’ at /etc/nixos/configuration.nix:44:5

I know that for many packages, although not all, the name that nix-env returns and the name one should specify in environment.systemPackages configuration option are different, but I don't understand the logic. How do I install a package that I found through nix-env?


NixOS community has three manuals, always consult them first, if you're stuck:

Every package on Nix is specified by a Nix expression. A Nix expression is some text, written in Nix language, typically residing in a file with extension .nix.

Every expression has the so-called “symbolic name”, a human-readable name that is printed, when you use nix-env. See sample Nix expression. Nix itself doesn't use this symbolic name anywhere internally, so it doesn't matter if your package is named aspell-dict-en, it's just for your, human's, convenience.

What actually matters is the so-called “attribute path”. So your confusion is between symbolic name and attribute path. Every package has an attribute path, which you can use in environment.systemPackages configuration option to install system-wide using declarative package management.

To find out your package's attribute path, add another flag -P to your query:

$ nix-env -qaP 'aspell.*en'
nixos.aspellDicts.en  aspell-dict-en-7.1-0

You should be comfortable using nix-env on a daily basis, so practice calling nix-env with --query and --install options. However you can also browse packages and find out their attribute paths online on Nix packages search. Type aspell, click on aspell-dict-en and you'll see various package's properties, including attribute path as part of the install command:

$ nix-env -iA nixos.pkgs.aspellDicts.en

Now you can put this attribute path into /etc/nixos/configuration.nix:

environment.systemPackages = with pkgs; [

Then update the system by running sudo nixos-rebuild switch.

  • 6
    Unfortunately, the -P option does not work with --installed, as can be seen with nix-env -q --installed -P | grep terminus which prints terminus-font instead of terminus_font. The workaround is to use nix-env -qaP | grep terminus-font, but it means that you can't easily dump the output of nix-env -q --installed into the configuration.nix. – Suzanne Soy Oct 14 '16 at 14:19

In case you are using NixOS for Data Science:

Python modules:

nix-env -qaP .\*pylint.\*


nix-env -qaP | grep -i python36 > ${py_pkgs}
grep pandas ${py_pkgs}

OR if your are searching especially for R packages/libraries

nix-env -f "<nixpkgs>" -qaP -A rPackages .\*tidyverse.\*

alternatively you get i.g. npm packages with:

nix-env -qaPA 'nixos.nodePackages'

there is also a website for searching for pkgs

nix-env -v -qaP '*' | grep "nvim"

I would save the result of nix-env -v -qaP '*' to a file (as it usually takes a while to return).

Bear in mind, nix-env seems to ignore things under haskellPackages (and possibly others). You can search for packages in subcategories such as haskellPackages via nix-env -f '<nixpkgs>' -qaPA haskellPackages

nix-env search is currently quite frustrating as it'll take 5+ seconds and then come back with a error: regex error...


Additional to Mirzhans options: you could check /nix/store like grep -irw "programm-name" /nix/store. But this could be a bit confusing. Also in your home directory you could check the directory .local/share for installed programms/apps.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.