nix-env(1) | General Commands Manual | nix-env(1) |
nix-env - manipulate or query Nix user environments
nix-env operation [options] [arguments…] [--option name value] [--arg name value] [--argstr name value] [{--file | -f} path] [{--profile | -p} path] [--system-filter system] [--dry-run]
The command nix-env is used to manipulate Nix user environments. User environments are sets of software packages available to a user at some point in time. In other words, they are a synthesised view of the programs available in the Nix store. There may be many user environments: different users can have different environments, and individual users can switch between different environments.
nix-env takes exactly one operation flag which indicates the subcommand to be performed. The following operations are available:
These pages can be viewed offline:
nix-env can obtain packages from multiple sources:
Several operations, such as nix-env --query and nix-env --install, take a list of arguments that specify the packages on which to operate.
Packages are identified based on a name part and a version part of a symbolic derivation name:
Example
nix-env parses the symbolic derivation name apache-httpd-2.0.48 as:
{ "name": "apache-httpd", "version": "2.0.48" }
Example
nix-env parses the symbolic derivation name firefox.* as:
{ "name": "firefox.*", "version": "" }
The name parts of the arguments to nix-env are treated as extended regular expressions and matched against the name parts of derivation names in the package source. The match is case-sensitive. The regular expression can optionally be followed by a dash (-) and a version number; if omitted, any version of the package will match. For details on regular expressions, see regex(7).
Example
Common patterns for finding package names with nix-env:
nix-env operates on the following files.
The source for the default Nix expressions used by nix-env:
It is loaded as follows:
Then, the resulting expression is interpreted like this:
For example, if the default expression contains two files, foo.nix and bar.nix, then the default Nix expression will be equivalent to
{ foo = import ~/.nix-defexpr/foo.nix; bar = import ~/.nix-defexpr/bar.nix; }
The file manifest.nix is always ignored.
The command nix-channel places a symlink to the user’s current channels profile in this directory. This makes all subscribed channels available as attributes in the default expression.
A symlink that ensures that nix-env can find your channels:
This symlink points to:
In a multi-user installation, you may also have ~/.nix-defexpr/channels_root, which links to the channels of the root user.nix-env: ../nix-env.md
A directory that contains links to profiles managed by nix-env and nix profile:
A profile is a directory of symlinks to files in the Nix store.
Profiles are versioned as follows. When using a profile named path, path is a symlink to path-N-link, where N is the version of the profile. In turn, path-N-link is a symlink to a path in the Nix store. For example:
$ ls -l ~alice/.local/state/nix/profiles/profile* lrwxrwxrwx 1 alice users 14 Nov 25 14:35 /home/alice/.local/state/nix/profiles/profile -> profile-7-link lrwxrwxrwx 1 alice users 51 Oct 28 16:18 /home/alice/.local/state/nix/profiles/profile-5-link -> /nix/store/q69xad13ghpf7ir87h0b2gd28lafjj1j-profile lrwxrwxrwx 1 alice users 51 Oct 29 13:20 /home/alice/.local/state/nix/profiles/profile-6-link -> /nix/store/6bvhpysd7vwz7k3b0pndn7ifi5xr32dg-profile lrwxrwxrwx 1 alice users 51 Nov 25 14:35 /home/alice/.local/state/nix/profiles/profile-7-link -> /nix/store/mp0x6xnsg0b8qhswy6riqvimai4gm677-profile
Each of these symlinks is a root for the Nix garbage collector.
The contents of the store path corresponding to each version of the profile is a tree of symlinks to the files of the installed packages, e.g.
$ ll -R ~eelco/.local/state/nix/profiles/profile-7-link/ /home/eelco/.local/state/nix/profiles/profile-7-link/: total 20 dr-xr-xr-x 2 root root 4096 Jan 1 1970 bin -r--r--r-- 2 root root 1402 Jan 1 1970 manifest.nix dr-xr-xr-x 4 root root 4096 Jan 1 1970 share /home/eelco/.local/state/nix/profiles/profile-7-link/bin: total 20 lrwxrwxrwx 5 root root 79 Jan 1 1970 chromium -> /nix/store/ijm5k0zqisvkdwjkc77mb9qzb35xfi4m-chromium-86.0.4240.111/bin/chromium lrwxrwxrwx 7 root root 87 Jan 1 1970 spotify -> /nix/store/w9182874m1bl56smps3m5zjj36jhp3rn-spotify-1.1.26.501.gbe11e53b-15/bin/spotify lrwxrwxrwx 3 root root 79 Jan 1 1970 zoom-us -> /nix/store/wbhg2ga8f3h87s9h5k0slxk0m81m4cxl-zoom-us-5.3.469451.0927/bin/zoom-us /home/eelco/.local/state/nix/profiles/profile-7-link/share/applications: total 12 lrwxrwxrwx 4 root root 120 Jan 1 1970 chromium-browser.desktop -> /nix/store/4cf803y4vzfm3gyk3vzhzb2327v0kl8a-chromium-unwrapped-86.0.4240.111/share/applications/chromium-browser.desktop lrwxrwxrwx 7 root root 110 Jan 1 1970 spotify.desktop -> /nix/store/w9182874m1bl56smps3m5zjj36jhp3rn-spotify-1.1.26.501.gbe11e53b-15/share/applications/spotify.desktop lrwxrwxrwx 3 root root 107 Jan 1 1970 us.zoom.Zoom.desktop -> /nix/store/wbhg2ga8f3h87s9h5k0slxk0m81m4cxl-zoom-us-5.3.469451.0927/share/applications/us.zoom.Zoom.desktop …
Each profile version contains a manifest file: - manifest.nix used by nix-env. - manifest.json used by nix profile (experimental).
A symbolic link to the user’s current profile:
By default, this symlink points to:
The PATH environment variable should include /bin subdirectory of the profile link (e.g. ~/.nix-profile/bin) for the user environment to be visible to the user. The installer sets this up by default, unless you enable use-xdg-base-directories.