aboutsummaryrefslogtreecommitdiff
path: root/doc/manual/src/command-ref
diff options
context:
space:
mode:
Diffstat (limited to 'doc/manual/src/command-ref')
-rw-r--r--doc/manual/src/command-ref/command-ref.md2
-rw-r--r--doc/manual/src/command-ref/conf-file-prefix.md51
-rw-r--r--doc/manual/src/command-ref/env-common.md124
-rw-r--r--doc/manual/src/command-ref/experimental-commands.md8
-rw-r--r--doc/manual/src/command-ref/files.md4
-rw-r--r--doc/manual/src/command-ref/main-commands.md4
-rw-r--r--doc/manual/src/command-ref/nix-build.md111
-rw-r--r--doc/manual/src/command-ref/nix-channel.md96
-rw-r--r--doc/manual/src/command-ref/nix-collect-garbage.md30
-rw-r--r--doc/manual/src/command-ref/nix-copy-closure.md85
-rw-r--r--doc/manual/src/command-ref/nix-daemon.md13
-rw-r--r--doc/manual/src/command-ref/nix-env.md880
-rw-r--r--doc/manual/src/command-ref/nix-hash.md102
-rw-r--r--doc/manual/src/command-ref/nix-instantiate.md158
-rw-r--r--doc/manual/src/command-ref/nix-prefetch-url.md78
-rw-r--r--doc/manual/src/command-ref/nix-shell.md275
-rw-r--r--doc/manual/src/command-ref/nix-store.md833
-rw-r--r--doc/manual/src/command-ref/opt-common-syn.md57
-rw-r--r--doc/manual/src/command-ref/opt-common.md219
-rw-r--r--doc/manual/src/command-ref/opt-inst-syn.md15
-rw-r--r--doc/manual/src/command-ref/utilities.md3
21 files changed, 3148 insertions, 0 deletions
diff --git a/doc/manual/src/command-ref/command-ref.md b/doc/manual/src/command-ref/command-ref.md
new file mode 100644
index 000000000..6a78075db
--- /dev/null
+++ b/doc/manual/src/command-ref/command-ref.md
@@ -0,0 +1,2 @@
+This section lists commands and options that you can use when you work
+with Nix.
diff --git a/doc/manual/src/command-ref/conf-file-prefix.md b/doc/manual/src/command-ref/conf-file-prefix.md
new file mode 100644
index 000000000..3140170ab
--- /dev/null
+++ b/doc/manual/src/command-ref/conf-file-prefix.md
@@ -0,0 +1,51 @@
+# Name
+
+`nix.conf` - Nix configuration file
+
+# Description
+
+By default Nix reads settings from the following places:
+
+ - The system-wide configuration file `sysconfdir/nix/nix.conf` (i.e.
+ `/etc/nix/nix.conf` on most systems), or `$NIX_CONF_DIR/nix.conf` if
+ `NIX_CONF_DIR` is set. Values loaded in this file are not forwarded
+ to the Nix daemon. The client assumes that the daemon has already
+ loaded them.
+
+ - If `NIX_USER_CONF_FILES` is set, then each path separated by `:`
+ will be loaded in reverse order.
+
+ Otherwise it will look for `nix/nix.conf` files in `XDG_CONFIG_DIRS`
+ and `XDG_CONFIG_HOME`. If these are unset, it will look in
+ `$HOME/.config/nix.conf`.
+
+ - If `NIX_CONFIG` is set, its contents is treated as the contents of
+ a configuration file.
+
+The configuration files consist of `name = value` pairs, one per
+line. Other files can be included with a line like `include path`,
+where *path* is interpreted relative to the current conf file and a
+missing file is an error unless `!include` is used instead. Comments
+start with a `#` character. Here is an example configuration file:
+
+ keep-outputs = true # Nice for developers
+ keep-derivations = true # Idem
+
+You can override settings on the command line using the `--option`
+flag, e.g. `--option keep-outputs false`. Every configuration setting
+also has a corresponding command line flag, e.g. `--max-jobs 16`; for
+Boolean settings, there are two flags to enable or disable the setting
+(e.g. `--keep-failed` and `--no-keep-failed`).
+
+A configuration setting usually overrides any previous value. However,
+you can prefix the name of the setting by `extra-` to *append* to the
+previous value. For instance,
+
+ substituters = a b
+ extra-substituters = c d
+
+defines the `substituters` setting to be `a b c d`. This is also
+available as a command line flag (e.g. `--extra-substituters`).
+
+The following settings are currently available:
+
diff --git a/doc/manual/src/command-ref/env-common.md b/doc/manual/src/command-ref/env-common.md
new file mode 100644
index 000000000..6e2403461
--- /dev/null
+++ b/doc/manual/src/command-ref/env-common.md
@@ -0,0 +1,124 @@
+# Common Environment Variables
+
+Most Nix commands interpret the following environment variables:
+
+ - `IN_NIX_SHELL`\
+ Indicator that tells if the current environment was set up by
+ `nix-shell`. Since Nix 2.0 the values are `"pure"` and `"impure"`
+
+ - `NIX_PATH`\
+ A colon-separated list of directories used to look up Nix
+ expressions enclosed in angle brackets (i.e., `<path>`). For
+ instance, the value
+
+ /home/eelco/Dev:/etc/nixos
+
+ will cause Nix to look for paths relative to `/home/eelco/Dev` and
+ `/etc/nixos`, in this order. It is also possible to match paths
+ against a prefix. For example, the value
+
+ nixpkgs=/home/eelco/Dev/nixpkgs-branch:/etc/nixos
+
+ will cause Nix to search for `<nixpkgs/path>` in
+ `/home/eelco/Dev/nixpkgs-branch/path` and `/etc/nixos/nixpkgs/path`.
+
+ If a path in the Nix search path starts with `http://` or
+ `https://`, it is interpreted as the URL of a tarball that will be
+ downloaded and unpacked to a temporary location. The tarball must
+ consist of a single top-level directory. For example, setting
+ `NIX_PATH` to
+
+ nixpkgs=https://github.com/NixOS/nixpkgs/archive/master.tar.gz
+
+ tells Nix to download and use the current contents of the
+ `master` branch in the `nixpkgs` repository.
+
+ The URLs of the tarballs from the official nixos.org channels (see
+ [the manual for `nix-channel`](nix-channel.md)) can be abbreviated
+ as `channel:<channel-name>`. For instance, the following two
+ values of `NIX_PATH` are equivalent:
+
+ nixpkgs=channel:nixos-21.05
+ nixpkgs=https://nixos.org/channels/nixos-21.05/nixexprs.tar.xz
+
+ The Nix search path can also be extended using the `-I` option to
+ many Nix commands, which takes precedence over `NIX_PATH`.
+
+ - `NIX_IGNORE_SYMLINK_STORE`\
+ Normally, the Nix store directory (typically `/nix/store`) is not
+ allowed to contain any symlink components. This is to prevent
+ “impure” builds. Builders sometimes “canonicalise” paths by
+ resolving all symlink components. Thus, builds on different machines
+ (with `/nix/store` resolving to different locations) could yield
+ different results. This is generally not a problem, except when
+ builds are deployed to machines where `/nix/store` resolves
+ differently. If you are sure that you’re not going to do that, you
+ can set `NIX_IGNORE_SYMLINK_STORE` to `1`.
+
+ Note that if you’re symlinking the Nix store so that you can put it
+ on another file system than the root file system, on Linux you’re
+ better off using `bind` mount points, e.g.,
+
+ ```console
+ $ mkdir /nix
+ $ mount -o bind /mnt/otherdisk/nix /nix
+ ```
+
+ Consult the mount 8 manual page for details.
+
+ - `NIX_STORE_DIR`\
+ Overrides the location of the Nix store (default `prefix/store`).
+
+ - `NIX_DATA_DIR`\
+ Overrides the location of the Nix static data directory (default
+ `prefix/share`).
+
+ - `NIX_LOG_DIR`\
+ Overrides the location of the Nix log directory (default
+ `prefix/var/log/nix`).
+
+ - `NIX_STATE_DIR`\
+ Overrides the location of the Nix state directory (default
+ `prefix/var/nix`).
+
+ - `NIX_CONF_DIR`\
+ Overrides the location of the system Nix configuration directory
+ (default `prefix/etc/nix`).
+
+ - `NIX_CONFIG`\
+ Applies settings from Nix configuration from the environment.
+ The content is treated as if it was read from a Nix configuration file.
+ Settings are separated by the newline character.
+
+ - `NIX_USER_CONF_FILES`\
+ Overrides the location of the user Nix configuration files to load
+ from (defaults to the XDG spec locations). The variable is treated
+ as a list separated by the `:` token.
+
+ - `TMPDIR`\
+ Use the specified directory to store temporary files. In particular,
+ this includes temporary build directories; these can take up
+ substantial amounts of disk space. The default is `/tmp`.
+
+ - `NIX_REMOTE`\
+ This variable should be set to `daemon` if you want to use the Nix
+ daemon to execute Nix operations. This is necessary in [multi-user
+ Nix installations](../installation/multi-user.md). If the Nix
+ daemon's Unix socket is at some non-standard path, this variable
+ should be set to `unix://path/to/socket`. Otherwise, it should be
+ left unset.
+
+ - `NIX_SHOW_STATS`\
+ If set to `1`, Nix will print some evaluation statistics, such as
+ the number of values allocated.
+
+ - `NIX_COUNT_CALLS`\
+ If set to `1`, Nix will print how often functions were called during
+ Nix expression evaluation. This is useful for profiling your Nix
+ expressions.
+
+ - `GC_INITIAL_HEAP_SIZE`\
+ If Nix has been configured to use the Boehm garbage collector, this
+ variable sets the initial size of the heap in bytes. It defaults to
+ 384 MiB. Setting it to a low value reduces memory consumption, but
+ will increase runtime due to the overhead of garbage collection.
diff --git a/doc/manual/src/command-ref/experimental-commands.md b/doc/manual/src/command-ref/experimental-commands.md
new file mode 100644
index 000000000..cfa6f8b73
--- /dev/null
+++ b/doc/manual/src/command-ref/experimental-commands.md
@@ -0,0 +1,8 @@
+# Experimental Commands
+
+This section lists experimental commands.
+
+> **Warning**
+>
+> These commands may be removed in the future, or their syntax may
+> change in incompatible ways.
diff --git a/doc/manual/src/command-ref/files.md b/doc/manual/src/command-ref/files.md
new file mode 100644
index 000000000..df5646c05
--- /dev/null
+++ b/doc/manual/src/command-ref/files.md
@@ -0,0 +1,4 @@
+# Files
+
+This section lists configuration files that you can use when you work
+with Nix.
diff --git a/doc/manual/src/command-ref/main-commands.md b/doc/manual/src/command-ref/main-commands.md
new file mode 100644
index 000000000..e4f1f1d0e
--- /dev/null
+++ b/doc/manual/src/command-ref/main-commands.md
@@ -0,0 +1,4 @@
+# Main Commands
+
+This section lists commands and options that you can use when you work
+with Nix.
diff --git a/doc/manual/src/command-ref/nix-build.md b/doc/manual/src/command-ref/nix-build.md
new file mode 100644
index 000000000..43de7a6e6
--- /dev/null
+++ b/doc/manual/src/command-ref/nix-build.md
@@ -0,0 +1,111 @@
+# Name
+
+`nix-build` - build a Nix expression
+
+# Synopsis
+
+`nix-build` [*paths…*]
+ [`--arg` *name* *value*]
+ [`--argstr` *name* *value*]
+ [{`--attr` | `-A`} *attrPath*]
+ [`--no-out-link`]
+ [`--dry-run`]
+ [{`--out-link` | `-o`} *outlink*]
+
+# Description
+
+The `nix-build` command builds the derivations described by the Nix
+expressions in *paths*. If the build succeeds, it places a symlink to
+the result in the current directory. The symlink is called `result`. If
+there are multiple Nix expressions, or the Nix expressions evaluate to
+multiple derivations, multiple sequentially numbered symlinks are
+created (`result`, `result-2`, and so on).
+
+If no *paths* are specified, then `nix-build` will use `default.nix` in
+the current directory, if it exists.
+
+If an element of *paths* starts with `http://` or `https://`, it is
+interpreted as the URL of a tarball that will be downloaded and unpacked
+to a temporary location. The tarball must include a single top-level
+directory containing at least a file named `default.nix`.
+
+`nix-build` is essentially a wrapper around
+[`nix-instantiate`](nix-instantiate.md) (to translate a high-level Nix
+expression to a low-level store derivation) and [`nix-store
+--realise`](nix-store.md#operation---realise) (to build the store
+derivation).
+
+> **Warning**
+>
+> The result of the build is automatically registered as a root of the
+> Nix garbage collector. This root disappears automatically when the
+> `result` symlink is deleted or renamed. So don’t rename the symlink.
+
+# Options
+
+All options not listed here are passed to `nix-store
+--realise`, except for `--arg` and `--attr` / `-A` which are passed to
+`nix-instantiate`.
+
+ - `--no-out-link`\
+ Do not create a symlink to the output path. Note that as a result
+ the output does not become a root of the garbage collector, and so
+ might be deleted by `nix-store
+ --gc`.
+
+ - `--dry-run`\
+ Show what store paths would be built or downloaded.
+
+ - `--out-link` / `-o` *outlink*\
+ Change the name of the symlink to the output path created from
+ `result` to *outlink*.
+
+The following common options are supported:
+
+# Examples
+
+```console
+$ nix-build '<nixpkgs>' -A firefox
+store derivation is /nix/store/qybprl8sz2lc...-firefox-1.5.0.7.drv
+/nix/store/d18hyl92g30l...-firefox-1.5.0.7
+
+$ ls -l result
+lrwxrwxrwx ... result -> /nix/store/d18hyl92g30l...-firefox-1.5.0.7
+
+$ ls ./result/bin/
+firefox firefox-config
+```
+
+If a derivation has multiple outputs, `nix-build` will build the default
+(first) output. You can also build all outputs:
+
+```console
+$ nix-build '<nixpkgs>' -A openssl.all
+```
+
+This will create a symlink for each output named `result-outputname`.
+The suffix is omitted if the output name is `out`. So if `openssl` has
+outputs `out`, `bin` and `man`, `nix-build` will create symlinks
+`result`, `result-bin` and `result-man`. It’s also possible to build a
+specific output:
+
+```console
+$ nix-build '<nixpkgs>' -A openssl.man
+```
+
+This will create a symlink `result-man`.
+
+Build a Nix expression given on the command line:
+
+```console
+$ nix-build -E 'with import <nixpkgs> { }; runCommand "foo" { } "echo bar > $out"'
+$ cat ./result
+bar
+```
+
+Build the GNU Hello package from the latest revision of the master
+branch of Nixpkgs:
+
+```console
+$ nix-build https://github.com/NixOS/nixpkgs/archive/master.tar.gz -A hello
+```
diff --git a/doc/manual/src/command-ref/nix-channel.md b/doc/manual/src/command-ref/nix-channel.md
new file mode 100644
index 000000000..24353525f
--- /dev/null
+++ b/doc/manual/src/command-ref/nix-channel.md
@@ -0,0 +1,96 @@
+# Name
+
+`nix-channel` - manage Nix channels
+
+# Synopsis
+
+`nix-channel` {`--add` url [*name*] | `--remove` *name* | `--list` | `--update` [*names…*] | `--rollback` [*generation*] }
+
+# Description
+
+A Nix channel is a mechanism that allows you to automatically stay
+up-to-date with a set of pre-built Nix expressions. A Nix channel is
+just a URL that points to a place containing a set of Nix expressions.
+
+To see the list of official NixOS channels, visit
+<https://nixos.org/channels>.
+
+This command has the following operations:
+
+ - `--add` *url* \[*name*\]\
+ Adds a channel named *name* with URL *url* to the list of subscribed
+ channels. If *name* is omitted, it defaults to the last component of
+ *url*, with the suffixes `-stable` or `-unstable` removed.
+
+ - `--remove` *name*\
+ Removes the channel named *name* from the list of subscribed
+ channels.
+
+ - `--list`\
+ Prints the names and URLs of all subscribed channels on standard
+ output.
+
+ - `--update` \[*names*…\]\
+ Downloads the Nix expressions of all subscribed channels (or only
+ those included in *names* if specified) and makes them the default
+ for `nix-env` operations (by symlinking them from the directory
+ `~/.nix-defexpr`).
+
+ - `--rollback` \[*generation*\]\
+ Reverts the previous call to `nix-channel
+ --update`. Optionally, you can specify a specific channel generation
+ number to restore.
+
+Note that `--add` does not automatically perform an update.
+
+The list of subscribed channels is stored in `~/.nix-channels`.
+
+# Examples
+
+To subscribe to the Nixpkgs channel and install the GNU Hello package:
+
+```console
+$ nix-channel --add https://nixos.org/channels/nixpkgs-unstable
+$ nix-channel --update
+$ nix-env -iA nixpkgs.hello
+```
+
+You can revert channel updates using `--rollback`:
+
+```console
+$ nix-instantiate --eval -E '(import <nixpkgs> {}).lib.version'
+"14.04.527.0e935f1"
+
+$ nix-channel --rollback
+switching from generation 483 to 482
+
+$ nix-instantiate --eval -E '(import <nixpkgs> {}).lib.version'
+"14.04.526.dbadfad"
+```
+
+# Files
+
+ - `/nix/var/nix/profiles/per-user/username/channels`\
+ `nix-channel` uses a `nix-env` profile to keep track of previous
+ versions of the subscribed channels. Every time you run `nix-channel
+ --update`, a new channel generation (that is, a symlink to the
+ channel Nix expressions in the Nix store) is created. This enables
+ `nix-channel --rollback` to revert to previous versions.
+
+ - `~/.nix-defexpr/channels`\
+ This is a symlink to
+ `/nix/var/nix/profiles/per-user/username/channels`. It ensures that
+ `nix-env` can find your channels. In a multi-user installation, you
+ may also have `~/.nix-defexpr/channels_root`, which links to the
+ channels of the root user.
+
+# Channel format
+
+A channel URL should point to a directory containing the following
+files:
+
+ - `nixexprs.tar.xz`\
+ A tarball containing Nix expressions and files referenced by them
+ (such as build scripts and patches). At the top level, the tarball
+ should contain a single directory. That directory must contain a
+ file `default.nix` that serves as the channel’s “entry point”.
diff --git a/doc/manual/src/command-ref/nix-collect-garbage.md b/doc/manual/src/command-ref/nix-collect-garbage.md
new file mode 100644
index 000000000..296165993
--- /dev/null
+++ b/doc/manual/src/command-ref/nix-collect-garbage.md
@@ -0,0 +1,30 @@
+# Name
+
+`nix-collect-garbage` - delete unreachable store paths
+
+# Synopsis
+
+`nix-collect-garbage` [`--delete-old`] [`-d`] [`--delete-older-than` *period*] [`--max-freed` *bytes*] [`--dry-run`]
+
+# Description
+
+The command `nix-collect-garbage` is mostly an alias of [`nix-store
+--gc`](nix-store.md#operation---gc), that is, it deletes all
+unreachable paths in the Nix store to clean up your system. However,
+it provides two additional options: `-d` (`--delete-old`), which
+deletes all old generations of all profiles in `/nix/var/nix/profiles`
+by invoking `nix-env --delete-generations old` on all profiles (of
+course, this makes rollbacks to previous configurations impossible);
+and `--delete-older-than` *period*, where period is a value such as
+`30d`, which deletes all generations older than the specified number
+of days in all profiles in `/nix/var/nix/profiles` (except for the
+generations that were active at that point in time).
+
+# Example
+
+To delete from the Nix store everything that is not used by the current
+generations of each profile, do
+
+```console
+$ nix-collect-garbage -d
+```
diff --git a/doc/manual/src/command-ref/nix-copy-closure.md b/doc/manual/src/command-ref/nix-copy-closure.md
new file mode 100644
index 000000000..7047d3012
--- /dev/null
+++ b/doc/manual/src/command-ref/nix-copy-closure.md
@@ -0,0 +1,85 @@
+# Name
+
+`nix-copy-closure` - copy a closure to or from a remote machine via SSH
+
+# Synopsis
+
+`nix-copy-closure`
+ [`--to` | `--from`]
+ [`--gzip`]
+ [`--include-outputs`]
+ [`--use-substitutes` | `-s`]
+ [`-v`]
+ _user@machine_ _paths_
+
+# Description
+
+`nix-copy-closure` gives you an easy and efficient way to exchange
+software between machines. Given one or more Nix store _paths_ on the
+local machine, `nix-copy-closure` computes the closure of those paths
+(i.e. all their dependencies in the Nix store), and copies all paths
+in the closure to the remote machine via the `ssh` (Secure Shell)
+command. With the `--from` option, the direction is reversed: the
+closure of _paths_ on a remote machine is copied to the Nix store on
+the local machine.
+
+This command is efficient because it only sends the store paths
+that are missing on the target machine.
+
+Since `nix-copy-closure` calls `ssh`, you may be asked to type in the
+appropriate password or passphrase. In fact, you may be asked _twice_
+because `nix-copy-closure` currently connects twice to the remote
+machine, first to get the set of paths missing on the target machine,
+and second to send the dump of those paths. If this bothers you, use
+`ssh-agent`.
+
+# Options
+
+ - `--to`\
+ Copy the closure of _paths_ from the local Nix store to the Nix
+ store on _machine_. This is the default.
+
+ - `--from`\
+ Copy the closure of _paths_ from the Nix store on _machine_ to the
+ local Nix store.
+
+ - `--gzip`\
+ Enable compression of the SSH connection.
+
+ - `--include-outputs`\
+ Also copy the outputs of store derivations included in the closure.
+
+ - `--use-substitutes` / `-s`\
+ Attempt to download missing paths on the target machine using Nix’s
+ substitute mechanism. Any paths that cannot be substituted on the
+ target are still copied normally from the source. This is useful,
+ for instance, if the connection between the source and target
+ machine is slow, but the connection between the target machine and
+ `nixos.org` (the default binary cache server) is
+ fast.
+
+ - `-v`\
+ Show verbose output.
+
+# Environment variables
+
+ - `NIX_SSHOPTS`\
+ Additional options to be passed to `ssh` on the command
+ line.
+
+# Examples
+
+Copy Firefox with all its dependencies to a remote machine:
+
+```console
+$ nix-copy-closure --to alice@itchy.labs $(type -tP firefox)
+```
+
+Copy Subversion from a remote machine and then install it into a user
+environment:
+
+```console
+$ nix-copy-closure --from alice@itchy.labs \
+ /nix/store/0dj0503hjxy5mbwlafv1rsbdiyx1gkdy-subversion-1.4.4
+$ nix-env -i /nix/store/0dj0503hjxy5mbwlafv1rsbdiyx1gkdy-subversion-1.4.4
+```
diff --git a/doc/manual/src/command-ref/nix-daemon.md b/doc/manual/src/command-ref/nix-daemon.md
new file mode 100644
index 000000000..e91cb01dd
--- /dev/null
+++ b/doc/manual/src/command-ref/nix-daemon.md
@@ -0,0 +1,13 @@
+# Name
+
+`nix-daemon` - Nix multi-user support daemon
+
+# Synopsis
+
+`nix-daemon`
+
+# Description
+
+The Nix daemon is necessary in multi-user Nix installations. It performs
+build actions and other operations on the Nix store on behalf of
+unprivileged users.
diff --git a/doc/manual/src/command-ref/nix-env.md b/doc/manual/src/command-ref/nix-env.md
new file mode 100644
index 000000000..9138fa05a
--- /dev/null
+++ b/doc/manual/src/command-ref/nix-env.md
@@ -0,0 +1,880 @@
+# Name
+
+`nix-env` - manipulate or query Nix user environments
+
+# Synopsis
+
+`nix-env`
+ [`--option` *name* *value*]
+ [`--arg` *name* *value*]
+ [`--argstr` *name* *value*]
+ [{`--file` | `-f`} *path*]
+ [{`--profile` | `-p`} *path(]
+ [`--system-filter` *system*]
+ [`--dry-run`]
+ *operation* [*options…*] [*arguments…*]
+
+# Description
+
+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. These are documented below.
+
+# Selectors
+
+Several commands, such as `nix-env -q` and `nix-env -i`, take a list of
+arguments that specify the packages on which to operate. These are
+extended regular expressions that must match the entire name of the
+package. (For details on regular expressions, see regex7.) 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. Here are some examples:
+
+ - `firefox`\
+ Matches the package name `firefox` and any version.
+
+ - `firefox-32.0`\
+ Matches the package name `firefox` and version `32.0`.
+
+ - `gtk\\+`\
+ Matches the package name `gtk+`. The `+` character must be escaped
+ using a backslash to prevent it from being interpreted as a
+ quantifier, and the backslash must be escaped in turn with another
+ backslash to ensure that the shell passes it on.
+
+ - `.\*`\
+ Matches any package name. This is the default for most commands.
+
+ - `'.*zip.*'`\
+ Matches any package name containing the string `zip`. Note the dots:
+ `'*zip*'` does not work, because in a regular expression, the
+ character `*` is interpreted as a quantifier.
+
+ - `'.*(firefox|chromium).*'`\
+ Matches any package name containing the strings `firefox` or
+ `chromium`.
+
+# Common options
+
+This section lists the options that are common to all operations. These
+options are allowed for every subcommand, though they may not always
+have an effect.
+
+ - `--file` / `-f` *path*\
+ Specifies the Nix expression (designated below as the *active Nix
+ expression*) used by the `--install`, `--upgrade`, and `--query
+ --available` operations to obtain derivations. The default is
+ `~/.nix-defexpr`.
+
+ If the argument starts with `http://` or `https://`, it is
+ interpreted as the URL of a tarball that will be downloaded and
+ unpacked to a temporary location. The tarball must include a single
+ top-level directory containing at least a file named `default.nix`.
+
+ - `--profile` / `-p` *path*\
+ Specifies the profile to be used by those operations that operate on
+ a profile (designated below as the *active profile*). A profile is a
+ sequence of user environments called *generations*, one of which is
+ the *current generation*.
+
+ - `--dry-run`\
+ For the `--install`, `--upgrade`, `--uninstall`,
+ `--switch-generation`, `--delete-generations` and `--rollback`
+ operations, this flag will cause `nix-env` to print what *would* be
+ done if this flag had not been specified, without actually doing it.
+
+ `--dry-run` also prints out which paths will be
+ [substituted](../glossary.md) (i.e., downloaded) and which paths
+ will be built from source (because no substitute is available).
+
+ - `--system-filter` *system*\
+ By default, operations such as `--query
+ --available` show derivations matching any platform. This option
+ allows you to use derivations for the specified platform *system*.
+
+<!-- end list -->
+
+# Files
+
+ - `~/.nix-defexpr`\
+ The source for the default Nix expressions used by the
+ `--install`, `--upgrade`, and `--query --available` operations to
+ obtain derivations. The `--file` option may be used to override
+ this default.
+
+ If `~/.nix-defexpr` is a file, it is loaded as a Nix expression. If
+ the expression is a set, it is used as the default Nix expression.
+ If the expression is a function, an empty set is passed as argument
+ and the return value is used as the default Nix expression.
+
+ If `~/.nix-defexpr` is a directory containing a `default.nix` file,
+ that file is loaded as in the above paragraph.
+
+ If `~/.nix-defexpr` is a directory without a `default.nix` file,
+ then its contents (both files and subdirectories) are loaded as Nix
+ expressions. The expressions are combined into a single set, each
+ expression under an attribute with the same name as the original
+ file or subdirectory.
+
+ For example, if `~/.nix-defexpr` contains two files, `foo.nix` and
+ `bar.nix`, then the default Nix expression will essentially be
+
+ ```nix
+ {
+ foo = import ~/.nix-defexpr/foo.nix;
+ bar = import ~/.nix-defexpr/bar.nix;
+ }
+ ```
+
+ The file `manifest.nix` is always ignored. Subdirectories without a
+ `default.nix` file are traversed recursively in search of more Nix
+ expressions, but the names of these intermediate directories are not
+ added to the attribute paths of the default Nix expression.
+
+ The command `nix-channel` places symlinks to the downloaded Nix
+ expressions from each subscribed channel in this directory.
+
+ - `~/.nix-profile`\
+ A symbolic link to the user's current profile. By default, this
+ symlink points to `prefix/var/nix/profiles/default`. The `PATH`
+ environment variable should include `~/.nix-profile/bin` for the
+ user environment to be visible to the user.
+
+# Operation `--install`
+
+## Synopsis
+
+`nix-env` {`--install` | `-i`} *args…*
+ [{`--prebuilt-only` | `-b`}]
+ [{`--attr` | `-A`}]
+ [`--from-expression`] [`-E`]
+ [`--from-profile` *path*]
+ [`--preserve-installed` | `-P`]
+ [`--remove-all` | `-r`]
+
+## Description
+
+The install operation creates a new user environment, based on the
+current generation of the active profile, to which a set of store paths
+described by *args* is added. The arguments *args* map to store paths in
+a number of possible ways:
+
+ - By default, *args* is a set of derivation names denoting derivations
+ in the active Nix expression. These are realised, and the resulting
+ output paths are installed. Currently installed derivations with a
+ name equal to the name of a derivation being added are removed
+ unless the option `--preserve-installed` is specified.
+
+ If there are multiple derivations matching a name in *args* that
+ have the same name (e.g., `gcc-3.3.6` and `gcc-4.1.1`), then the
+ derivation with the highest *priority* is used. A derivation can
+ define a priority by declaring the `meta.priority` attribute. This
+ attribute should be a number, with a higher value denoting a lower
+ priority. The default priority is `0`.
+
+ If there are multiple matching derivations with the same priority,
+ then the derivation with the highest version will be installed.
+
+ You can force the installation of multiple derivations with the same
+ name by being specific about the versions. For instance, `nix-env -i
+ gcc-3.3.6 gcc-4.1.1` will install both version of GCC (and will
+ probably cause a user environment conflict\!).
+
+ - If `--attr` (`-A`) is specified, the arguments are *attribute
+ paths* that select attributes from the top-level Nix
+ expression. This is faster than using derivation names and
+ unambiguous. To find out the attribute paths of available
+ packages, use `nix-env -qaP`.
+
+ - If `--from-profile` *path* is given, *args* is a set of names
+ denoting installed store paths in the profile *path*. This is an
+ easy way to copy user environment elements from one profile to
+ another.
+
+ - If `--from-expression` is given, *args* are Nix
+ [functions](../expressions/language-constructs.md#functions)
+ that are called with the active Nix expression as their single
+ argument. The derivations returned by those function calls are
+ installed. This allows derivations to be specified in an
+ unambiguous way, which is necessary if there are multiple
+ derivations with the same name.
+
+ - If *args* are store derivations, then these are
+ [realised](nix-store.md#operation---realise), and the resulting output paths
+ are installed.
+
+ - If *args* are store paths that are not store derivations, then these
+ are [realised](nix-store.md#operation---realise) and installed.
+
+ - By default all outputs are installed for each derivation. That can
+ be reduced by setting `meta.outputsToInstall`.
+
+## Flags
+
+ - `--prebuilt-only` / `-b`\
+ Use only derivations for which a substitute is registered, i.e.,
+ there is a pre-built binary available that can be downloaded in lieu
+ of building the derivation. Thus, no packages will be built from
+ source.
+
+ - `--preserve-installed`; `-P`\
+ Do not remove derivations with a name matching one of the
+ derivations being installed. Usually, trying to have two versions of
+ the same package installed in the same generation of a profile will
+ lead to an error in building the generation, due to file name
+ clashes between the two versions. However, this is not the case for
+ all packages.
+
+ - `--remove-all`; `-r`\
+ Remove all previously installed packages first. This is equivalent
+ to running `nix-env -e '.*'` first, except that everything happens
+ in a single transaction.
+
+## Examples
+
+To install a specific version of `gcc` from the active Nix expression:
+
+```console
+$ nix-env --install gcc-3.3.2
+installing `gcc-3.3.2'
+uninstalling `gcc-3.1'
+```
+
+Note the previously installed version is removed, since
+`--preserve-installed` was not specified.
+
+To install an arbitrary version:
+
+```console
+$ nix-env --install gcc
+installing `gcc-3.3.2'
+```
+
+To install using a specific attribute:
+
+```console
+$ nix-env -i -A gcc40mips
+$ nix-env -i -A xorg.xorgserver
+```
+
+To install all derivations in the Nix expression `foo.nix`:
+
+```console
+$ nix-env -f ~/foo.nix -i '.*'
+```
+
+To copy the store path with symbolic name `gcc` from another profile:
+
+```console
+$ nix-env -i --from-profile /nix/var/nix/profiles/foo gcc
+```
+
+To install a specific store derivation (typically created by
+`nix-instantiate`):
+
+```console
+$ nix-env -i /nix/store/fibjb1bfbpm5mrsxc4mh2d8n37sxh91i-gcc-3.4.3.drv
+```
+
+To install a specific output path:
+
+```console
+$ nix-env -i /nix/store/y3cgx0xj1p4iv9x0pnnmdhr8iyg741vk-gcc-3.4.3
+```
+
+To install from a Nix expression specified on the command-line:
+
+```console
+$ nix-env -f ./foo.nix -i -E \
+ 'f: (f {system = "i686-linux";}).subversionWithJava'
+```
+
+I.e., this evaluates to `(f: (f {system =
+"i686-linux";}).subversionWithJava) (import ./foo.nix)`, thus selecting
+the `subversionWithJava` attribute from the set returned by calling the
+function defined in `./foo.nix`.
+
+A dry-run tells you which paths will be downloaded or built from source:
+
+```console
+$ nix-env -f '<nixpkgs>' -iA hello --dry-run
+(dry run; not doing anything)
+installing ‘hello-2.10’
+this path will be fetched (0.04 MiB download, 0.19 MiB unpacked):
+ /nix/store/wkhdf9jinag5750mqlax6z2zbwhqb76n-hello-2.10
+ ...
+```
+
+To install Firefox from the latest revision in the Nixpkgs/NixOS 14.12
+channel:
+
+```console
+$ nix-env -f https://github.com/NixOS/nixpkgs/archive/nixos-14.12.tar.gz -iA firefox
+```
+
+# Operation `--upgrade`
+
+## Synopsis
+
+`nix-env` {`--upgrade` | `-u`} *args*
+ [`--lt` | `--leq` | `--eq` | `--always`]
+ [{`--prebuilt-only` | `-b`}]
+ [{`--attr` | `-A`}]
+ [`--from-expression`] [`-E`]
+ [`--from-profile` *path*]
+ [`--preserve-installed` | `-P`]
+
+## Description
+
+The upgrade operation creates a new user environment, based on the
+current generation of the active profile, in which all store paths are
+replaced for which there are newer versions in the set of paths
+described by *args*. Paths for which there are no newer versions are
+left untouched; this is not an error. It is also not an error if an
+element of *args* matches no installed derivations.
+
+For a description of how *args* is mapped to a set of store paths, see
+[`--install`](#operation---install). If *args* describes multiple
+store paths with the same symbolic name, only the one with the highest
+version is installed.
+
+## Flags
+
+ - `--lt`\
+ Only upgrade a derivation to newer versions. This is the default.
+
+ - `--leq`\
+ In addition to upgrading to newer versions, also “upgrade” to
+ derivations that have the same version. Version are not a unique
+ identification of a derivation, so there may be many derivations
+ that have the same version. This flag may be useful to force
+ “synchronisation” between the installed and available derivations.
+
+ - `--eq`\
+ *Only* “upgrade” to derivations that have the same version. This may
+ not seem very useful, but it actually is, e.g., when there is a new
+ release of Nixpkgs and you want to replace installed applications
+ with the same versions built against newer dependencies (to reduce
+ the number of dependencies floating around on your system).
+
+ - `--always`\
+ In addition to upgrading to newer versions, also “upgrade” to
+ derivations that have the same or a lower version. I.e., derivations
+ may actually be downgraded depending on what is available in the
+ active Nix expression.
+
+For the other flags, see `--install`.
+
+## Examples
+
+```console
+$ nix-env --upgrade gcc
+upgrading `gcc-3.3.1' to `gcc-3.4'
+```
+
+```console
+$ nix-env -u gcc-3.3.2 --always (switch to a specific version)
+upgrading `gcc-3.4' to `gcc-3.3.2'
+```
+
+```console
+$ nix-env --upgrade pan
+(no upgrades available, so nothing happens)
+```
+
+```console
+$ nix-env -u (try to upgrade everything)
+upgrading `hello-2.1.2' to `hello-2.1.3'
+upgrading `mozilla-1.2' to `mozilla-1.4'
+```
+
+## Versions
+
+The upgrade operation determines whether a derivation `y` is an upgrade
+of a derivation `x` by looking at their respective `name` attributes.
+The names (e.g., `gcc-3.3.1` are split into two parts: the package name
+(`gcc`), and the version (`3.3.1`). The version part starts after the
+first dash not followed by a letter. `x` is considered an upgrade of `y`
+if their package names match, and the version of `y` is higher that that
+of `x`.
+
+The versions are compared by splitting them into contiguous components
+of numbers and letters. E.g., `3.3.1pre5` is split into `[3, 3, 1,
+"pre", 5]`. These lists are then compared lexicographically (from left
+to right). Corresponding components `a` and `b` are compared as follows.
+If they are both numbers, integer comparison is used. If `a` is an empty
+string and `b` is a number, `a` is considered less than `b`. The special
+string component `pre` (for *pre-release*) is considered to be less than
+other components. String components are considered less than number
+components. Otherwise, they are compared lexicographically (i.e., using
+case-sensitive string comparison).
+
+This is illustrated by the following examples:
+
+ 1.0 < 2.3
+ 2.1 < 2.3
+ 2.3 = 2.3
+ 2.5 > 2.3
+ 3.1 > 2.3
+ 2.3.1 > 2.3
+ 2.3.1 > 2.3a
+ 2.3pre1 < 2.3
+ 2.3pre3 < 2.3pre12
+ 2.3a < 2.3c
+ 2.3pre1 < 2.3c
+ 2.3pre1 < 2.3q
+
+# Operation `--uninstall`
+
+## Synopsis
+
+`nix-env` {`--uninstall` | `-e`} *drvnames…*
+
+## Description
+
+The uninstall operation creates a new user environment, based on the
+current generation of the active profile, from which the store paths
+designated by the symbolic names *drvnames* are removed.
+
+## Examples
+
+```console
+$ nix-env --uninstall gcc
+$ nix-env -e '.*' (remove everything)
+```
+
+# Operation `--set`
+
+## Synopsis
+
+`nix-env` `--set` *drvname*
+
+## Description
+
+The `--set` operation modifies the current generation of a profile so
+that it contains exactly the specified derivation, and nothing else.
+
+## Examples
+
+The following updates a profile such that its current generation will
+contain just Firefox:
+
+```console
+$ nix-env -p /nix/var/nix/profiles/browser --set firefox
+```
+
+# Operation `--set-flag`
+
+## Synopsis
+
+`nix-env` `--set-flag` *name* *value* *drvnames*
+
+## Description
+
+The `--set-flag` operation allows meta attributes of installed packages
+to be modified. There are several attributes that can be usefully
+modified, because they affect the behaviour of `nix-env` or the user
+environment build script:
+
+ - `priority` can be changed to resolve filename clashes. The user
+ environment build script uses the `meta.priority` attribute of
+ derivations to resolve filename collisions between packages. Lower
+ priority values denote a higher priority. For instance, the GCC
+ wrapper package and the Binutils package in Nixpkgs both have a file
+ `bin/ld`, so previously if you tried to install both you would get a
+ collision. Now, on the other hand, the GCC wrapper declares a higher
+ priority than Binutils, so the former’s `bin/ld` is symlinked in the
+ user environment.
+
+ - `keep` can be set to `true` to prevent the package from being
+ upgraded or replaced. This is useful if you want to hang on to an
+ older version of a package.
+
+ - `active` can be set to `false` to “disable” the package. That is, no
+ symlinks will be generated to the files of the package, but it
+ remains part of the profile (so it won’t be garbage-collected). It
+ can be set back to `true` to re-enable the package.
+
+## Examples
+
+To prevent the currently installed Firefox from being upgraded:
+
+```console
+$ nix-env --set-flag keep true firefox
+```
+
+After this, `nix-env -u` will ignore Firefox.
+
+To disable the currently installed Firefox, then install a new Firefox
+while the old remains part of the profile:
+
+```console
+$ nix-env -q
+firefox-2.0.0.9 (the current one)
+
+$ nix-env --preserve-installed -i firefox-2.0.0.11
+installing `firefox-2.0.0.11'
+building path(s) `/nix/store/myy0y59q3ig70dgq37jqwg1j0rsapzsl-user-environment'
+collision between `/nix/store/...-firefox-2.0.0.11/bin/firefox'
+ and `/nix/store/...-firefox-2.0.0.9/bin/firefox'.
+(i.e., can’t have two active at the same time)
+
+$ nix-env --set-flag active false firefox
+setting flag on `firefox-2.0.0.9'
+
+$ nix-env --preserve-installed -i firefox-2.0.0.11
+installing `firefox-2.0.0.11'
+
+$ nix-env -q
+firefox-2.0.0.11 (the enabled one)
+firefox-2.0.0.9 (the disabled one)
+```
+
+To make files from `binutils` take precedence over files from `gcc`:
+
+```console
+$ nix-env --set-flag priority 5 binutils
+$ nix-env --set-flag priority 10 gcc
+```
+
+# Operation `--query`
+
+## Synopsis
+
+`nix-env` {`--query` | `-q`} *names…*
+ [`--installed` | `--available` | `-a`]
+ [{`--status` | `-s`}]
+ [{`--attr-path` | `-P`}]
+ [`--no-name`]
+ [{`--compare-versions` | `-c`}]
+ [`--system`]
+ [`--drv-path`]
+ [`--out-path`]
+ [`--description`]
+ [`--meta`]
+ [`--xml`]
+ [`--json`]
+ [{`--prebuilt-only` | `-b`}]
+ [{`--attr` | `-A`} *attribute-path*]
+
+## Description
+
+The query operation displays information about either the store paths
+that are installed in the current generation of the active profile
+(`--installed`), or the derivations that are available for installation
+in the active Nix expression (`--available`). It only prints information
+about derivations whose symbolic name matches one of *names*.
+
+The derivations are sorted by their `name` attributes.
+
+## Source selection
+
+The following flags specify the set of things on which the query
+operates.
+
+ - `--installed`\
+ The query operates on the store paths that are installed in the
+ current generation of the active profile. This is the default.
+
+ - `--available`; `-a`\
+ The query operates on the derivations that are available in the
+ active Nix expression.
+
+## Queries
+
+The following flags specify what information to display about the
+selected derivations. Multiple flags may be specified, in which case the
+information is shown in the order given here. Note that the name of the
+derivation is shown unless `--no-name` is specified.
+
+ - `--xml`\
+ Print the result in an XML representation suitable for automatic
+ processing by other tools. The root element is called `items`, which
+ contains a `item` element for each available or installed
+ derivation. The fields discussed below are all stored in attributes
+ of the `item` elements.
+
+ - `--json`\
+ Print the result in a JSON representation suitable for automatic
+ processing by other tools.
+
+ - `--prebuilt-only` / `-b`\
+ Show only derivations for which a substitute is registered, i.e.,
+ there is a pre-built binary available that can be downloaded in lieu
+ of building the derivation. Thus, this shows all packages that
+ probably can be installed quickly.
+
+ - `--status`; `-s`\
+ Print the *status* of the derivation. The status consists of three
+ characters. The first is `I` or `-`, indicating whether the
+ derivation is currently installed in the current generation of the
+ active profile. This is by definition the case for `--installed`,
+ but not for `--available`. The second is `P` or `-`, indicating
+ whether the derivation is present on the system. This indicates
+ whether installation of an available derivation will require the
+ derivation to be built. The third is `S` or `-`, indicating whether
+ a substitute is available for the derivation.
+
+ - `--attr-path`; `-P`\
+ Print the *attribute path* of the derivation, which can be used to
+ unambiguously select it using the `--attr` option available in
+ commands that install derivations like `nix-env --install`. This
+ option only works together with `--available`
+
+ - `--no-name`\
+ Suppress printing of the `name` attribute of each derivation.
+
+ - `--compare-versions` / `-c`\
+ Compare installed versions to available versions, or vice versa (if
+ `--available` is given). This is useful for quickly seeing whether
+ upgrades for installed packages are available in a Nix expression. A
+ column is added with the following meaning:
+
+ - `<` *version*\
+ A newer version of the package is available or installed.
+
+ - `=` *version*\
+ At most the same version of the package is available or
+ installed.
+
+ - `>` *version*\
+ Only older versions of the package are available or installed.
+
+ - `- ?`\
+ No version of the package is available or installed.
+
+ - `--system`\
+ Print the `system` attribute of the derivation.
+
+ - `--drv-path`\
+ Print the path of the store derivation.
+
+ - `--out-path`\
+ Print the output path of the derivation.
+
+ - `--description`\
+ Print a short (one-line) description of the derivation, if
+ available. The description is taken from the `meta.description`
+ attribute of the derivation.
+
+ - `--meta`\
+ Print all of the meta-attributes of the derivation. This option is
+ only available with `--xml` or `--json`.
+
+## Examples
+
+To show installed packages:
+
+```console
+$ nix-env -q
+bison-1.875c
+docbook-xml-4.2
+firefox-1.0.4
+MPlayer-1.0pre7
+ORBit2-2.8.3
+…
+```
+
+To show available packages:
+
+```console
+$ nix-env -qa
+firefox-1.0.7
+GConf-2.4.0.1
+MPlayer-1.0pre7
+ORBit2-2.8.3
+…
+```
+
+To show the status of available packages:
+
+```console
+$ nix-env -qas
+-P- firefox-1.0.7 (not installed but present)
+--S GConf-2.4.0.1 (not present, but there is a substitute for fast installation)
+--S MPlayer-1.0pre3 (i.e., this is not the installed MPlayer, even though the version is the same!)
+IP- ORBit2-2.8.3 (installed and by definition present)
+…
+```
+
+To show available packages in the Nix expression `foo.nix`:
+
+```console
+$ nix-env -f ./foo.nix -qa
+foo-1.2.3
+```
+
+To compare installed versions to what’s available:
+
+```console
+$ nix-env -qc
+...
+acrobat-reader-7.0 - ? (package is not available at all)
+autoconf-2.59 = 2.59 (same version)
+firefox-1.0.4 < 1.0.7 (a more recent version is available)
+...
+```
+
+To show all packages with “`zip`” in the name:
+
+```console
+$ nix-env -qa '.*zip.*'
+bzip2-1.0.6
+gzip-1.6
+zip-3.0
+…
+```
+
+To show all packages with “`firefox`” or “`chromium`” in the name:
+
+```console
+$ nix-env -qa '.*(firefox|chromium).*'
+chromium-37.0.2062.94
+chromium-beta-38.0.2125.24
+firefox-32.0.3
+firefox-with-plugins-13.0.1
+…
+```
+
+To show all packages in the latest revision of the Nixpkgs repository:
+
+```console
+$ nix-env -f https://github.com/NixOS/nixpkgs/archive/master.tar.gz -qa
+```
+
+# Operation `--switch-profile`
+
+## Synopsis
+
+`nix-env` {`--switch-profile` | `-S`} *path*
+
+## Description
+
+This operation makes *path* the current profile for the user. That is,
+the symlink `~/.nix-profile` is made to point to *path*.
+
+## Examples
+
+```console
+$ nix-env -S ~/my-profile
+```
+
+# Operation `--list-generations`
+
+## Synopsis
+
+`nix-env` `--list-generations`
+
+## Description
+
+This operation print a list of all the currently existing generations
+for the active profile. These may be switched to using the
+`--switch-generation` operation. It also prints the creation date of the
+generation, and indicates the current generation.
+
+## Examples
+
+```console
+$ nix-env --list-generations
+ 95 2004-02-06 11:48:24
+ 96 2004-02-06 11:49:01
+ 97 2004-02-06 16:22:45
+ 98 2004-02-06 16:24:33 (current)
+```
+
+# Operation `--delete-generations`
+
+## Synopsis
+
+`nix-env` `--delete-generations` *generations*
+
+## Description
+
+This operation deletes the specified generations of the current profile.
+The generations can be a list of generation numbers, the special value
+`old` to delete all non-current generations, a value such as `30d` to
+delete all generations older than the specified number of days (except
+for the generation that was active at that point in time), or a value
+such as `+5` to keep the last `5` generations ignoring any newer than
+current, e.g., if `30` is the current generation `+5` will delete
+generation `25` and all older generations. Periodically deleting old
+generations is important to make garbage collection effective.
+
+## Examples
+
+```console
+$ nix-env --delete-generations 3 4 8
+```
+
+```console
+$ nix-env --delete-generations +5
+```
+
+```console
+$ nix-env --delete-generations 30d
+```
+
+```console
+$ nix-env -p other_profile --delete-generations old
+```
+
+# Operation `--switch-generation`
+
+## Synopsis
+
+`nix-env` {`--switch-generation` | `-G`} *generation*
+
+## Description
+
+This operation makes generation number *generation* the current
+generation of the active profile. That is, if the `profile` is the path
+to the active profile, then the symlink `profile` is made to point to
+`profile-generation-link`, which is in turn a symlink to the actual user
+environment in the Nix store.
+
+Switching will fail if the specified generation does not exist.
+
+## Examples
+
+```console
+$ nix-env -G 42
+switching from generation 50 to 42
+```
+
+# Operation `--rollback`
+
+## Synopsis
+
+`nix-env` `--rollback`
+
+## Description
+
+This operation switches to the “previous” generation of the active
+profile, that is, the highest numbered generation lower than the current
+generation, if it exists. It is just a convenience wrapper around
+`--list-generations` and `--switch-generation`.
+
+## Examples
+
+```console
+$ nix-env --rollback
+switching from generation 92 to 91
+```
+
+```console
+$ nix-env --rollback
+error: no generation older than the current (91) exists
+```
+
+# Environment variables
+
+ - `NIX_PROFILE`\
+ Location of the Nix profile. Defaults to the target of the symlink
+ `~/.nix-profile`, if it exists, or `/nix/var/nix/profiles/default`
+ otherwise.
diff --git a/doc/manual/src/command-ref/nix-hash.md b/doc/manual/src/command-ref/nix-hash.md
new file mode 100644
index 000000000..45f67f1c5
--- /dev/null
+++ b/doc/manual/src/command-ref/nix-hash.md
@@ -0,0 +1,102 @@
+# Name
+
+`nix-hash` - compute the cryptographic hash of a path
+
+# Synopsis
+
+`nix-hash` [`--flat`] [`--base32`] [`--truncate`] [`--type` *hashAlgo*] *path…*
+
+`nix-hash` `--to-base16` *hash…*
+
+`nix-hash` `--to-base32` *hash…*
+
+# Description
+
+The command `nix-hash` computes the cryptographic hash of the contents
+of each *path* and prints it on standard output. By default, it computes
+an MD5 hash, but other hash algorithms are available as well. The hash
+is printed in hexadecimal. To generate the same hash as
+`nix-prefetch-url` you have to specify multiple arguments, see below for
+an example.
+
+The hash is computed over a *serialisation* of each path: a dump of
+the file system tree rooted at the path. This allows directories and
+symlinks to be hashed as well as regular files. The dump is in the
+*NAR format* produced by [`nix-store
+--dump`](nix-store.md#operation---dump). Thus, `nix-hash path`
+yields the same cryptographic hash as `nix-store --dump path |
+md5sum`.
+
+# Options
+
+ - `--flat`\
+ Print the cryptographic hash of the contents of each regular file
+ *path*. That is, do not compute the hash over the dump of *path*.
+ The result is identical to that produced by the GNU commands
+ `md5sum` and `sha1sum`.
+
+ - `--base32`\
+ Print the hash in a base-32 representation rather than hexadecimal.
+ This base-32 representation is more compact and can be used in Nix
+ expressions (such as in calls to `fetchurl`).
+
+ - `--truncate`\
+ Truncate hashes longer than 160 bits (such as SHA-256) to 160 bits.
+
+ - `--type` *hashAlgo*\
+ Use the specified cryptographic hash algorithm, which can be one of
+ `md5`, `sha1`, `sha256`, and `sha512`.
+
+ - `--to-base16`\
+ Don’t hash anything, but convert the base-32 hash representation
+ *hash* to hexadecimal.
+
+ - `--to-base32`\
+ Don’t hash anything, but convert the hexadecimal hash representation
+ *hash* to base-32.
+
+# Examples
+
+Computing the same hash as `nix-prefetch-url`:
+
+```console
+$ nix-prefetch-url file://<(echo test)
+1lkgqb6fclns49861dwk9rzb6xnfkxbpws74mxnx01z9qyv1pjpj
+$ nix-hash --type sha256 --flat --base32 <(echo test)
+1lkgqb6fclns49861dwk9rzb6xnfkxbpws74mxnx01z9qyv1pjpj
+```
+
+Computing hashes:
+
+```console
+$ mkdir test
+$ echo "hello" > test/world
+
+$ nix-hash test/ (MD5 hash; default)
+8179d3caeff1869b5ba1744e5a245c04
+
+$ nix-store --dump test/ | md5sum (for comparison)
+8179d3caeff1869b5ba1744e5a245c04 -
+
+$ nix-hash --type sha1 test/
+e4fd8ba5f7bbeaea5ace89fe10255536cd60dab6
+
+$ nix-hash --type sha1 --base32 test/
+nvd61k9nalji1zl9rrdfmsmvyyjqpzg4
+
+$ nix-hash --type sha256 --flat test/
+error: reading file `test/': Is a directory
+
+$ nix-hash --type sha256 --flat test/world
+5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03
+```
+
+Converting between hexadecimal and base-32:
+
+```console
+$ nix-hash --type sha1 --to-base32 e4fd8ba5f7bbeaea5ace89fe10255536cd60dab6
+nvd61k9nalji1zl9rrdfmsmvyyjqpzg4
+
+$ nix-hash --type sha1 --to-base16 nvd61k9nalji1zl9rrdfmsmvyyjqpzg4
+e4fd8ba5f7bbeaea5ace89fe10255536cd60dab6
+```
diff --git a/doc/manual/src/command-ref/nix-instantiate.md b/doc/manual/src/command-ref/nix-instantiate.md
new file mode 100644
index 000000000..2e198daed
--- /dev/null
+++ b/doc/manual/src/command-ref/nix-instantiate.md
@@ -0,0 +1,158 @@
+# Name
+
+`nix-instantiate` - instantiate store derivations from Nix expressions
+
+# Synopsis
+
+`nix-instantiate`
+ [`--parse` | `--eval` [`--strict`] [`--json`] [`--xml`] ]
+ [`--read-write-mode`]
+ [`--arg` *name* *value*]
+ [{`--attr`| `-A`} *attrPath*]
+ [`--add-root` *path*]
+ [`--expr` | `-E`]
+ *files…*
+
+`nix-instantiate` `--find-file` *files…*
+
+# Description
+
+The command `nix-instantiate` generates [store
+derivations](../glossary.md) from (high-level) Nix expressions. It
+evaluates the Nix expressions in each of *files* (which defaults to
+*./default.nix*). Each top-level expression should evaluate to a
+derivation, a list of derivations, or a set of derivations. The paths
+of the resulting store derivations are printed on standard output.
+
+If *files* is the character `-`, then a Nix expression will be read from
+standard input.
+
+# Options
+
+ - `--add-root` *path*\
+ See the [corresponding option](nix-store.md) in `nix-store`.
+
+ - `--parse`\
+ Just parse the input files, and print their abstract syntax trees on
+ standard output in ATerm format.
+
+ - `--eval`\
+ Just parse and evaluate the input files, and print the resulting
+ values on standard output. No instantiation of store derivations
+ takes place.
+
+ - `--find-file`\
+ Look up the given files in Nix’s search path (as specified by the
+ `NIX_PATH` environment variable). If found, print the corresponding
+ absolute paths on standard output. For instance, if `NIX_PATH` is
+ `nixpkgs=/home/alice/nixpkgs`, then `nix-instantiate --find-file
+ nixpkgs/default.nix` will print `/home/alice/nixpkgs/default.nix`.
+
+ - `--strict`\
+ When used with `--eval`, recursively evaluate list elements and
+ attributes. Normally, such sub-expressions are left unevaluated
+ (since the Nix expression language is lazy).
+
+ > **Warning**
+ >
+ > This option can cause non-termination, because lazy data
+ > structures can be infinitely large.
+
+ - `--json`\
+ When used with `--eval`, print the resulting value as an JSON
+ representation of the abstract syntax tree rather than as an ATerm.
+
+ - `--xml`\
+ When used with `--eval`, print the resulting value as an XML
+ representation of the abstract syntax tree rather than as an ATerm.
+ The schema is the same as that used by the [`toXML`
+ built-in](../expressions/builtins.md).
+
+ - `--read-write-mode`\
+ When used with `--eval`, perform evaluation in read/write mode so
+ nix language features that require it will still work (at the cost
+ of needing to do instantiation of every evaluated derivation). If
+ this option is not enabled, there may be uninstantiated store paths
+ in the final output.
+
+<!-- end list -->
+
+# Examples
+
+Instantiating store derivations from a Nix expression, and building them
+using `nix-store`:
+
+```console
+$ nix-instantiate test.nix (instantiate)
+/nix/store/cigxbmvy6dzix98dxxh9b6shg7ar5bvs-perl-BerkeleyDB-0.26.drv
+
+$ nix-store -r $(nix-instantiate test.nix) (build)
+...
+/nix/store/qhqk4n8ci095g3sdp93x7rgwyh9rdvgk-perl-BerkeleyDB-0.26 (output path)
+
+$ ls -l /nix/store/qhqk4n8ci095g3sdp93x7rgwyh9rdvgk-perl-BerkeleyDB-0.26
+dr-xr-xr-x 2 eelco users 4096 1970-01-01 01:00 lib
+...
+```
+
+You can also give a Nix expression on the command line:
+
+```console
+$ nix-instantiate -E 'with import <nixpkgs> { }; hello'
+/nix/store/j8s4zyv75a724q38cb0r87rlczaiag4y-hello-2.8.drv
+```
+
+This is equivalent to:
+
+```console
+$ nix-instantiate '<nixpkgs>' -A hello
+```
+
+Parsing and evaluating Nix expressions:
+
+```console
+$ nix-instantiate --parse -E '1 + 2'
+1 + 2
+```
+
+```console
+$ nix-instantiate --eval -E '1 + 2'
+3
+```
+
+```console
+$ nix-instantiate --eval --xml -E '1 + 2'
+<?xml version='1.0' encoding='utf-8'?>
+<expr>
+ <int value="3" />
+</expr>
+```
+
+The difference between non-strict and strict evaluation:
+
+```console
+$ nix-instantiate --eval --xml -E 'rec { x = "foo"; y = x; }'
+...
+ <attr name="x">
+ <string value="foo" />
+ </attr>
+ <attr name="y">
+ <unevaluated />
+ </attr>
+...
+```
+
+Note that `y` is left unevaluated (the XML representation doesn’t
+attempt to show non-normal forms).
+
+```console
+$ nix-instantiate --eval --xml --strict -E 'rec { x = "foo"; y = x; }'
+...
+ <attr name="x">
+ <string value="foo" />
+ </attr>
+ <attr name="y">
+ <string value="foo" />
+ </attr>
+...
+```
diff --git a/doc/manual/src/command-ref/nix-prefetch-url.md b/doc/manual/src/command-ref/nix-prefetch-url.md
new file mode 100644
index 000000000..3bcd209e2
--- /dev/null
+++ b/doc/manual/src/command-ref/nix-prefetch-url.md
@@ -0,0 +1,78 @@
+# Name
+
+`nix-prefetch-url` - copy a file from a URL into the store and print its hash
+
+# Synopsis
+
+`nix-prefetch-url` *url* [*hash*]
+ [`--type` *hashAlgo*]
+ [`--print-path`]
+ [`--unpack`]
+ [`--name` *name*]
+
+# Description
+
+The command `nix-prefetch-url` downloads the file referenced by the URL
+*url*, prints its cryptographic hash, and copies it into the Nix store.
+The file name in the store is `hash-baseName`, where *baseName* is
+everything following the final slash in *url*.
+
+This command is just a convenience for Nix expression writers. Often a
+Nix expression fetches some source distribution from the network using
+the `fetchurl` expression contained in Nixpkgs. However, `fetchurl`
+requires a cryptographic hash. If you don't know the hash, you would
+have to download the file first, and then `fetchurl` would download it
+again when you build your Nix expression. Since `fetchurl` uses the same
+name for the downloaded file as `nix-prefetch-url`, the redundant
+download can be avoided.
+
+If *hash* is specified, then a download is not performed if the Nix
+store already contains a file with the same hash and base name.
+Otherwise, the file is downloaded, and an error is signaled if the
+actual hash of the file does not match the specified hash.
+
+This command prints the hash on standard output. Additionally, if the
+option `--print-path` is used, the path of the downloaded file in the
+Nix store is also printed.
+
+# Options
+
+ - `--type` *hashAlgo*\
+ Use the specified cryptographic hash algorithm, which can be one of
+ `md5`, `sha1`, `sha256`, and `sha512`.
+
+ - `--print-path`\
+ Print the store path of the downloaded file on standard output.
+
+ - `--unpack`\
+ Unpack the archive (which must be a tarball or zip file) and add the
+ result to the Nix store. The resulting hash can be used with
+ functions such as Nixpkgs’s `fetchzip` or `fetchFromGitHub`.
+
+ - `--executable`\
+ Set the executable bit on the downloaded file.
+
+ - `--name` *name*\
+ Override the name of the file in the Nix store. By default, this is
+ `hash-basename`, where *basename* is the last component of *url*.
+ Overriding the name is necessary when *basename* contains characters
+ that are not allowed in Nix store paths.
+
+# Examples
+
+```console
+$ nix-prefetch-url ftp://ftp.gnu.org/pub/gnu/hello/hello-2.10.tar.gz
+0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i
+```
+
+```console
+$ nix-prefetch-url --print-path mirror://gnu/hello/hello-2.10.tar.gz
+0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i
+/nix/store/3x7dwzq014bblazs7kq20p9hyzz0qh8g-hello-2.10.tar.gz
+```
+
+```console
+$ nix-prefetch-url --unpack --print-path https://github.com/NixOS/patchelf/archive/0.8.tar.gz
+079agjlv0hrv7fxnx9ngipx14gyncbkllxrp9cccnh3a50fxcmy7
+/nix/store/19zrmhm3m40xxaw81c8cqm6aljgrnwj2-0.8.tar.gz
+```
diff --git a/doc/manual/src/command-ref/nix-shell.md b/doc/manual/src/command-ref/nix-shell.md
new file mode 100644
index 000000000..72f6730f1
--- /dev/null
+++ b/doc/manual/src/command-ref/nix-shell.md
@@ -0,0 +1,275 @@
+# Name
+
+`nix-shell` - start an interactive shell based on a Nix expression
+
+# Synopsis
+
+`nix-shell`
+ [`--arg` *name* *value*]
+ [`--argstr` *name* *value*]
+ [{`--attr` | `-A`} *attrPath*]
+ [`--command` *cmd*]
+ [`--run` *cmd*]
+ [`--exclude` *regexp*]
+ [--pure]
+ [--keep *name*]
+ {{`--packages` | `-p`} {*packages* | *expressions*} … | [*path*]}
+
+# Description
+
+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.
+
+If *path* is not given, `nix-shell` defaults to `shell.nix` if it
+exists, and `default.nix` otherwise.
+
+If *path* starts with `http://` or `https://`, it is interpreted as the
+URL of a tarball that will be downloaded and unpacked to a temporary
+location. The tarball must include a single top-level directory
+containing at least a file named `default.nix`.
+
+If the derivation defines the variable `shellHook`, it will be run
+after `$stdenv/setup` has been sourced. Since this hook is not executed
+by regular Nix builds, it allows you to perform initialisation specific
+to `nix-shell`. For example, the derivation attribute
+
+```nix
+shellHook =
+ ''
+ echo "Hello shell"
+ export SOME_API_TOKEN="$(cat ~/.config/some-app/api-token)"
+ '';
+```
+
+will cause `nix-shell` to print `Hello shell` and set the `SOME_API_TOKEN`
+environment variable to a user-configured value.
+
+# Options
+
+All options not listed here are passed to `nix-store
+--realise`, except for `--arg` and `--attr` / `-A` which are passed to
+`nix-instantiate`.
+
+ - `--command` *cmd*\
+ In the environment of the derivation, run the shell command *cmd*.
+ This command is executed in an interactive shell. (Use `--run` to
+ use a non-interactive shell instead.) However, a call to `exit` is
+ implicitly added to the command, so the shell will exit after
+ running the command. To prevent this, add `return` at the end;
+ e.g. `--command "echo Hello; return"` will print `Hello` and then
+ drop you into the interactive shell. This can be useful for doing
+ any additional initialisation.
+
+ - `--run` *cmd*\
+ Like `--command`, but executes the command in a non-interactive
+ shell. This means (among other things) that if you hit Ctrl-C while
+ the command is running, the shell exits.
+
+ - `--exclude` *regexp*\
+ Do not build any dependencies whose store path matches the regular
+ expression *regexp*. This option may be specified multiple times.
+
+ - `--pure`\
+ If this flag is specified, the environment is almost entirely
+ cleared before the interactive shell is started, so you get an
+ environment that more closely corresponds to the “real” Nix build. A
+ few variables, in particular `HOME`, `USER` and `DISPLAY`, are
+ retained.
+
+ - `--packages` / `-p` *packages*…\
+ Set up an environment in which the specified packages are present.
+ The command line arguments are interpreted as attribute names inside
+ the Nix Packages collection. Thus, `nix-shell -p libjpeg openjdk`
+ will start a shell in which the packages denoted by the attribute
+ names `libjpeg` and `openjdk` are present.
+
+ - `-i` *interpreter*\
+ The chained script interpreter to be invoked by `nix-shell`. Only
+ applicable in `#!`-scripts (described below).
+
+ - `--keep` *name*\
+ When a `--pure` shell is started, keep the listed environment
+ variables.
+
+The following common options are supported:
+
+# Environment variables
+
+ - `NIX_BUILD_SHELL`\
+ Shell used to start the interactive environment. Defaults to the
+ `bash` found in `PATH`.
+
+# Examples
+
+To build the dependencies of the package Pan, and start an interactive
+shell in which to build it:
+
+```console
+$ nix-shell '<nixpkgs>' -A pan
+[nix-shell]$ unpackPhase
+[nix-shell]$ cd pan-*
+[nix-shell]$ configurePhase
+[nix-shell]$ buildPhase
+[nix-shell]$ ./pan/gui/pan
+```
+
+To clear the environment first, and do some additional automatic
+initialisation of the interactive shell:
+
+```console
+$ nix-shell '<nixpkgs>' -A pan --pure \
+ --command 'export NIX_DEBUG=1; export NIX_CORES=8; return'
+```
+
+Nix expressions can also be given on the command line using the `-E` and
+`-p` flags. For instance, the following starts a shell containing the
+packages `sqlite` and `libX11`:
+
+```console
+$ nix-shell -E 'with import <nixpkgs> { }; runCommand "dummy" { buildInputs = [ sqlite xorg.libX11 ]; } ""'
+```
+
+A shorter way to do the same is:
+
+```console
+$ nix-shell -p sqlite xorg.libX11
+[nix-shell]$ echo $NIX_LDFLAGS
+… -L/nix/store/j1zg5v…-sqlite-3.8.0.2/lib -L/nix/store/0gmcz9…-libX11-1.6.1/lib …
+```
+
+Note that `-p` accepts multiple full nix expressions that are valid in
+the `buildInputs = [ ... ]` shown above, not only package names. So the
+following is also legal:
+
+```console
+$ nix-shell -p sqlite 'git.override { withManual = false; }'
+```
+
+The `-p` flag looks up Nixpkgs in the Nix search path. You can override
+it by passing `-I` or setting `NIX_PATH`. For example, the following
+gives you a shell containing the Pan package from a specific revision of
+Nixpkgs:
+
+```console
+$ nix-shell -p pan -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/8a3eea054838b55aca962c3fbde9c83c102b8bf2.tar.gz
+
+[nix-shell:~]$ pan --version
+Pan 0.139
+```
+
+# Use as a `#!`-interpreter
+
+You can use `nix-shell` as a script interpreter to allow scripts written
+in arbitrary languages to obtain their own dependencies via Nix. This is
+done by starting the script with the following lines:
+
+```bash
+#! /usr/bin/env nix-shell
+#! nix-shell -i real-interpreter -p packages
+```
+
+where *real-interpreter* is the “real” script interpreter that will be
+invoked by `nix-shell` after it has obtained the dependencies and
+initialised the environment, and *packages* are the attribute names of
+the dependencies in Nixpkgs.
+
+The lines starting with `#! nix-shell` specify `nix-shell` options (see
+above). Note that you cannot write `#! /usr/bin/env nix-shell -i ...`
+because many operating systems only allow one argument in `#!` lines.
+
+For example, here is a Python script that depends on Python and the
+`prettytable` package:
+
+```python
+#! /usr/bin/env nix-shell
+#! nix-shell -i python -p python pythonPackages.prettytable
+
+import prettytable
+
+# Print a simple table.
+t = prettytable.PrettyTable(["N", "N^2"])
+for n in range(1, 10): t.add_row([n, n * n])
+print t
+```
+
+Similarly, the following is a Perl script that specifies that it
+requires Perl and the `HTML::TokeParser::Simple` and `LWP` packages:
+
+```perl
+#! /usr/bin/env nix-shell
+#! nix-shell -i perl -p perl perlPackages.HTMLTokeParserSimple perlPackages.LWP
+
+use HTML::TokeParser::Simple;
+
+# Fetch nixos.org and print all hrefs.
+my $p = HTML::TokeParser::Simple->new(url => 'http://nixos.org/');
+
+while (my $token = $p->get_tag("a")) {
+ my $href = $token->get_attr("href");
+ print "$href\n" if $href;
+}
+```
+
+Sometimes you need to pass a simple Nix expression to customize a
+package like Terraform:
+
+```bash
+#! /usr/bin/env nix-shell
+#! nix-shell -i bash -p "terraform.withPlugins (plugins: [ plugins.openstack ])"
+
+terraform apply
+```
+
+> **Note**
+>
+> You must use double quotes (`"`) when passing a simple Nix expression
+> in a nix-shell shebang.
+
+Finally, using the merging of multiple nix-shell shebangs the following
+Haskell script uses a specific branch of Nixpkgs/NixOS (the 20.03 stable
+branch):
+
+```haskell
+#! /usr/bin/env nix-shell
+#! nix-shell -i runghc -p "haskellPackages.ghcWithPackages (ps: [ps.download-curl ps.tagsoup])"
+#! nix-shell -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/nixos-20.03.tar.gz
+
+import Network.Curl.Download
+import Text.HTML.TagSoup
+import Data.Either
+import Data.ByteString.Char8 (unpack)
+
+-- Fetch nixos.org and print all hrefs.
+main = do
+ resp <- openURI "https://nixos.org/"
+ let tags = filter (isTagOpenName "a") $ parseTags $ unpack $ fromRight undefined resp
+ let tags' = map (fromAttrib "href") tags
+ mapM_ putStrLn $ filter (/= "") tags'
+```
+
+If you want to be even more precise, you can specify a specific revision
+of Nixpkgs:
+
+ #! nix-shell -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/0672315759b3e15e2121365f067c1c8c56bb4722.tar.gz
+
+The examples above all used `-p` to get dependencies from Nixpkgs. You
+can also use a Nix expression to build your own dependencies. For
+example, the Python example could have been written as:
+
+```python
+#! /usr/bin/env nix-shell
+#! nix-shell deps.nix -i python
+```
+
+where the file `deps.nix` in the same directory as the `#!`-script
+contains:
+
+```nix
+with import <nixpkgs> {};
+
+runCommand "dummy" { buildInputs = [ python pythonPackages.prettytable ]; } ""
+```
diff --git a/doc/manual/src/command-ref/nix-store.md b/doc/manual/src/command-ref/nix-store.md
new file mode 100644
index 000000000..7a131dc02
--- /dev/null
+++ b/doc/manual/src/command-ref/nix-store.md
@@ -0,0 +1,833 @@
+# Name
+
+`nix-store` - manipulate or query the Nix store
+
+# Synopsis
+
+`nix-store` *operation* [*options…*] [*arguments…*]
+ [`--option` *name* *value*]
+ [`--add-root` *path*]
+
+# Description
+
+The command `nix-store` performs primitive operations on the Nix store.
+You generally do not need to run this command manually.
+
+`nix-store` takes exactly one *operation* flag which indicates the
+subcommand to be performed. These are documented below.
+
+# Common options
+
+This section lists the options that are common to all operations. These
+options are allowed for every subcommand, though they may not always
+have an effect.
+
+ - `--add-root` *path*\
+ Causes the result of a realisation (`--realise` and
+ `--force-realise`) to be registered as a root of the garbage
+ collector. *path* will be created as a symlink to the resulting
+ store path. In addition, a uniquely named symlink to *path* will
+ be created in `/nix/var/nix/gcroots/auto/`. For instance,
+
+ ```console
+ $ nix-store --add-root /home/eelco/bla/result -r ...
+
+ $ ls -l /nix/var/nix/gcroots/auto
+ lrwxrwxrwx 1 ... 2005-03-13 21:10 dn54lcypm8f8... -> /home/eelco/bla/result
+
+ $ ls -l /home/eelco/bla/result
+ lrwxrwxrwx 1 ... 2005-03-13 21:10 /home/eelco/bla/result -> /nix/store/1r11343n6qd4...-f-spot-0.0.10
+ ```
+
+ Thus, when `/home/eelco/bla/result` is removed, the GC root in the
+ `auto` directory becomes a dangling symlink and will be ignored by
+ the collector.
+
+ > **Warning**
+ >
+ > Note that it is not possible to move or rename GC roots, since
+ > the symlink in the `auto` directory will still point to the old
+ > location.
+
+ If there are multiple results, then multiple symlinks will be
+ created by sequentially numbering symlinks beyond the first one
+ (e.g., `foo`, `foo-2`, `foo-3`, and so on).
+
+# Operation `--realise`
+
+## Synopsis
+
+`nix-store` {`--realise` | `-r`} *paths…* [`--dry-run`]
+
+## Description
+
+The operation `--realise` essentially “builds” the specified store
+paths. Realisation is a somewhat overloaded term:
+
+ - If the store path is a *derivation*, realisation ensures that the
+ output paths of the derivation are [valid](../glossary.md) (i.e.,
+ the output path and its closure exist in the file system). This
+ can be done in several ways. First, it is possible that the
+ outputs are already valid, in which case we are done
+ immediately. Otherwise, there may be [substitutes](../glossary.md)
+ that produce the outputs (e.g., by downloading them). Finally, the
+ outputs can be produced by performing the build action described
+ by the derivation.
+
+ - If the store path is not a derivation, realisation ensures that the
+ specified path is valid (i.e., it and its closure exist in the file
+ system). If the path is already valid, we are done immediately.
+ Otherwise, the path and any missing paths in its closure may be
+ produced through substitutes. If there are no (successful)
+ substitutes, realisation fails.
+
+The output path of each derivation is printed on standard output. (For
+non-derivations argument, the argument itself is printed.)
+
+The following flags are available:
+
+ - `--dry-run`\
+ Print on standard error a description of what packages would be
+ built or downloaded, without actually performing the operation.
+
+ - `--ignore-unknown`\
+ If a non-derivation path does not have a substitute, then silently
+ ignore it.
+
+ - `--check`\
+ This option allows you to check whether a derivation is
+ deterministic. It rebuilds the specified derivation and checks
+ whether the result is bitwise-identical with the existing outputs,
+ printing an error if that’s not the case. The outputs of the
+ specified derivation must already exist. When used with `-K`, if an
+ output path is not identical to the corresponding output from the
+ previous build, the new output path is left in
+ `/nix/store/name.check.`
+
+ See also the `build-repeat` configuration option, which repeats a
+ derivation a number of times and prevents its outputs from being
+ registered as “valid” in the Nix store unless they are identical.
+
+Special exit codes:
+
+ - `100`\
+ Generic build failure, the builder process returned with a non-zero
+ exit code.
+
+ - `101`\
+ Build timeout, the build was aborted because it did not complete
+ within the specified `timeout`.
+
+ - `102`\
+ Hash mismatch, the build output was rejected because it does not
+ match the [`outputHash` attribute of the
+ derivation](../expressions/advanced-attributes.md).
+
+ - `104`\
+ Not deterministic, the build succeeded in check mode but the
+ resulting output is not binary reproducable.
+
+With the `--keep-going` flag it's possible for multiple failures to
+occur, in this case the 1xx status codes are or combined using binary
+or.
+
+ 1100100
+ ^^^^
+ |||`- timeout
+ ||`-- output hash mismatch
+ |`--- build failure
+ `---- not deterministic
+
+## Examples
+
+This operation is typically used to build store derivations produced by
+[`nix-instantiate`](nix-instantiate.md):
+
+```console
+$ nix-store -r $(nix-instantiate ./test.nix)
+/nix/store/31axcgrlbfsxzmfff1gyj1bf62hvkby2-aterm-2.3.1
+```
+
+This is essentially what [`nix-build`](nix-build.md) does.
+
+To test whether a previously-built derivation is deterministic:
+
+```console
+$ nix-build '<nixpkgs>' -A hello --check -K
+```
+
+# Operation `--serve`
+
+## Synopsis
+
+`nix-store` `--serve` [`--write`]
+
+## Description
+
+The operation `--serve` provides access to the Nix store over stdin and
+stdout, and is intended to be used as a means of providing Nix store
+access to a restricted ssh user.
+
+The following flags are available:
+
+ - `--write`\
+ Allow the connected client to request the realization of
+ derivations. In effect, this can be used to make the host act as a
+ remote builder.
+
+## Examples
+
+To turn a host into a build server, the `authorized_keys` file can be
+used to provide build access to a given SSH public key:
+
+```console
+$ cat <<EOF >>/root/.ssh/authorized_keys
+command="nice -n20 nix-store --serve --write" ssh-rsa AAAAB3NzaC1yc2EAAAA...
+EOF
+```
+
+# Operation `--gc`
+
+## Synopsis
+
+`nix-store` `--gc` [`--print-roots` | `--print-live` | `--print-dead`] [`--max-freed` *bytes*]
+
+## Description
+
+Without additional flags, the operation `--gc` performs a garbage
+collection on the Nix store. That is, all paths in the Nix store not
+reachable via file system references from a set of “roots”, are deleted.
+
+The following suboperations may be specified:
+
+ - `--print-roots`\
+ This operation prints on standard output the set of roots used by
+ the garbage collector.
+
+ - `--print-live`\
+ This operation prints on standard output the set of “live” store
+ paths, which are all the store paths reachable from the roots. Live
+ paths should never be deleted, since that would break consistency —
+ it would become possible that applications are installed that
+ reference things that are no longer present in the store.
+
+ - `--print-dead`\
+ This operation prints out on standard output the set of “dead” store
+ paths, which is just the opposite of the set of live paths: any path
+ in the store that is not live (with respect to the roots) is dead.
+
+By default, all unreachable paths are deleted. The following options
+control what gets deleted and in what order:
+
+ - `--max-freed` *bytes*\
+ Keep deleting paths until at least *bytes* bytes have been deleted,
+ then stop. The argument *bytes* can be followed by the
+ multiplicative suffix `K`, `M`, `G` or `T`, denoting KiB, MiB, GiB
+ or TiB units.
+
+The behaviour of the collector is also influenced by the
+`keep-outputs` and `keep-derivations` settings in the Nix
+configuration file.
+
+By default, the collector prints the total number of freed bytes when it
+finishes (or when it is interrupted). With `--print-dead`, it prints the
+number of bytes that would be freed.
+
+## Examples
+
+To delete all unreachable paths, just do:
+
+```console
+$ nix-store --gc
+deleting `/nix/store/kq82idx6g0nyzsp2s14gfsc38npai7lf-cairo-1.0.4.tar.gz.drv'
+...
+8825586 bytes freed (8.42 MiB)
+```
+
+To delete at least 100 MiBs of unreachable paths:
+
+```console
+$ nix-store --gc --max-freed $((100 * 1024 * 1024))
+```
+
+# Operation `--delete`
+
+## Synopsis
+
+`nix-store` `--delete` [`--ignore-liveness`] *paths…*
+
+## Description
+
+The operation `--delete` deletes the store paths *paths* from the Nix
+store, but only if it is safe to do so; that is, when the path is not
+reachable from a root of the garbage collector. This means that you can
+only delete paths that would also be deleted by `nix-store --gc`. Thus,
+`--delete` is a more targeted version of `--gc`.
+
+With the option `--ignore-liveness`, reachability from the roots is
+ignored. However, the path still won’t be deleted if there are other
+paths in the store that refer to it (i.e., depend on it).
+
+## Example
+
+```console
+$ nix-store --delete /nix/store/zq0h41l75vlb4z45kzgjjmsjxvcv1qk7-mesa-6.4
+0 bytes freed (0.00 MiB)
+error: cannot delete path `/nix/store/zq0h41l75vlb4z45kzgjjmsjxvcv1qk7-mesa-6.4' since it is still alive
+```
+
+# Operation `--query`
+
+## Synopsis
+
+`nix-store` {`--query` | `-q`}
+ {`--outputs` | `--requisites` | `-R` | `--references` |
+ `--referrers` | `--referrers-closure` | `--deriver` | `-d` |
+ `--graph` | `--tree` | `--binding` *name* | `-b` *name* | `--hash` |
+ `--size` | `--roots`}
+ [`--use-output`] [`-u`] [`--force-realise`] [`-f`]
+ *paths…*
+
+## Description
+
+The operation `--query` displays various bits of information about the
+store paths . The queries are described below. At most one query can be
+specified. The default query is `--outputs`.
+
+The paths *paths* may also be symlinks from outside of the Nix store, to
+the Nix store. In that case, the query is applied to the target of the
+symlink.
+
+## Common query options
+
+ - `--use-output`; `-u`\
+ For each argument to the query that is a store derivation, apply the
+ query to the output path of the derivation instead.
+
+ - `--force-realise`; `-f`\
+ Realise each argument to the query first (see [`nix-store
+ --realise`](#operation---realise)).
+
+## Queries
+
+ - `--outputs`\
+ Prints out the [output paths](../glossary.md) of the store
+ derivations *paths*. These are the paths that will be produced when
+ the derivation is built.
+
+ - `--requisites`; `-R`\
+ Prints out the [closure](../glossary.md) of the store path *paths*.
+
+ This query has one option:
+
+ - `--include-outputs`
+ Also include the output path of store derivations, and their
+ closures.
+
+ This query can be used to implement various kinds of deployment. A
+ *source deployment* is obtained by distributing the closure of a
+ store derivation. A *binary deployment* is obtained by distributing
+ the closure of an output path. A *cache deployment* (combined
+ source/binary deployment, including binaries of build-time-only
+ dependencies) is obtained by distributing the closure of a store
+ derivation and specifying the option `--include-outputs`.
+
+ - `--references`\
+ Prints the set of [references](../glossary.md) of the store paths
+ *paths*, that is, their immediate dependencies. (For *all*
+ dependencies, use `--requisites`.)
+
+ - `--referrers`\
+ Prints the set of *referrers* of the store paths *paths*, that is,
+ the store paths currently existing in the Nix store that refer to
+ one of *paths*. Note that contrary to the references, the set of
+ referrers is not constant; it can change as store paths are added or
+ removed.
+
+ - `--referrers-closure`\
+ Prints the closure of the set of store paths *paths* under the
+ referrers relation; that is, all store paths that directly or
+ indirectly refer to one of *paths*. These are all the path currently
+ in the Nix store that are dependent on *paths*.
+
+ - `--deriver`; `-d`\
+ Prints the [deriver](../glossary.md) of the store paths *paths*. If
+ the path has no deriver (e.g., if it is a source file), or if the
+ deriver is not known (e.g., in the case of a binary-only
+ deployment), the string `unknown-deriver` is printed.
+
+ - `--graph`\
+ Prints the references graph of the store paths *paths* in the format
+ of the `dot` tool of AT\&T's [Graphviz
+ package](http://www.graphviz.org/). This can be used to visualise
+ dependency graphs. To obtain a build-time dependency graph, apply
+ this to a store derivation. To obtain a runtime dependency graph,
+ apply it to an output path.
+
+ - `--tree`\
+ Prints the references graph of the store paths *paths* as a nested
+ ASCII tree. References are ordered by descending closure size; this
+ tends to flatten the tree, making it more readable. The query only
+ recurses into a store path when it is first encountered; this
+ prevents a blowup of the tree representation of the graph.
+
+ - `--graphml`\
+ Prints the references graph of the store paths *paths* in the
+ [GraphML](http://graphml.graphdrawing.org/) file format. This can be
+ used to visualise dependency graphs. To obtain a build-time
+ dependency graph, apply this to a store derivation. To obtain a
+ runtime dependency graph, apply it to an output path.
+
+ - `--binding` *name*; `-b` *name*\
+ Prints the value of the attribute *name* (i.e., environment
+ variable) of the store derivations *paths*. It is an error for a
+ derivation to not have the specified attribute.
+
+ - `--hash`\
+ Prints the SHA-256 hash of the contents of the store paths *paths*
+ (that is, the hash of the output of `nix-store --dump` on the given
+ paths). Since the hash is stored in the Nix database, this is a fast
+ operation.
+
+ - `--size`\
+ Prints the size in bytes of the contents of the store paths *paths*
+ — to be precise, the size of the output of `nix-store --dump` on
+ the given paths. Note that the actual disk space required by the
+ store paths may be higher, especially on filesystems with large
+ cluster sizes.
+
+ - `--roots`\
+ Prints the garbage collector roots that point, directly or
+ indirectly, at the store paths *paths*.
+
+## Examples
+
+Print the closure (runtime dependencies) of the `svn` program in the
+current user environment:
+
+```console
+$ nix-store -qR $(which svn)
+/nix/store/5mbglq5ldqld8sj57273aljwkfvj22mc-subversion-1.1.4
+/nix/store/9lz9yc6zgmc0vlqmn2ipcpkjlmbi51vv-glibc-2.3.4
+...
+```
+
+Print the build-time dependencies of `svn`:
+
+```console
+$ nix-store -qR $(nix-store -qd $(which svn))
+/nix/store/02iizgn86m42q905rddvg4ja975bk2i4-grep-2.5.1.tar.bz2.drv
+/nix/store/07a2bzxmzwz5hp58nf03pahrv2ygwgs3-gcc-wrapper.sh
+/nix/store/0ma7c9wsbaxahwwl04gbw3fcd806ski4-glibc-2.3.4.drv
+... lots of other paths ...
+```
+
+The difference with the previous example is that we ask the closure of
+the derivation (`-qd`), not the closure of the output path that contains
+`svn`.
+
+Show the build-time dependencies as a tree:
+
+```console
+$ nix-store -q --tree $(nix-store -qd $(which svn))
+/nix/store/7i5082kfb6yjbqdbiwdhhza0am2xvh6c-subversion-1.1.4.drv
++---/nix/store/d8afh10z72n8l1cr5w42366abiblgn54-builder.sh
++---/nix/store/fmzxmpjx2lh849ph0l36snfj9zdibw67-bash-3.0.drv
+| +---/nix/store/570hmhmx3v57605cqg9yfvvyh0nnb8k8-bash
+| +---/nix/store/p3srsbd8dx44v2pg6nbnszab5mcwx03v-builder.sh
+...
+```
+
+Show all paths that depend on the same OpenSSL library as `svn`:
+
+```console
+$ nix-store -q --referrers $(nix-store -q --binding openssl $(nix-store -qd $(which svn)))
+/nix/store/23ny9l9wixx21632y2wi4p585qhva1q8-sylpheed-1.0.0
+/nix/store/5mbglq5ldqld8sj57273aljwkfvj22mc-subversion-1.1.4
+/nix/store/dpmvp969yhdqs7lm2r1a3gng7pyq6vy4-subversion-1.1.3
+/nix/store/l51240xqsgg8a7yrbqdx1rfzyv6l26fx-lynx-2.8.5
+```
+
+Show all paths that directly or indirectly depend on the Glibc (C
+library) used by `svn`:
+
+```console
+$ nix-store -q --referrers-closure $(ldd $(which svn) | grep /libc.so | awk '{print $3}')
+/nix/store/034a6h4vpz9kds5r6kzb9lhh81mscw43-libgnomeprintui-2.8.2
+/nix/store/15l3yi0d45prm7a82pcrknxdh6nzmxza-gawk-3.1.4
+...
+```
+
+Note that `ldd` is a command that prints out the dynamic libraries used
+by an ELF executable.
+
+Make a picture of the runtime dependency graph of the current user
+environment:
+
+```console
+$ nix-store -q --graph ~/.nix-profile | dot -Tps > graph.ps
+$ gv graph.ps
+```
+
+Show every garbage collector root that points to a store path that
+depends on `svn`:
+
+```console
+$ nix-store -q --roots $(which svn)
+/nix/var/nix/profiles/default-81-link
+/nix/var/nix/profiles/default-82-link
+/nix/var/nix/profiles/per-user/eelco/profile-97-link
+```
+
+# Operation `--add`
+
+## Synopsis
+
+`nix-store` `--add` *paths…*
+
+## Description
+
+The operation `--add` adds the specified paths to the Nix store. It
+prints the resulting paths in the Nix store on standard output.
+
+## Example
+
+```console
+$ nix-store --add ./foo.c
+/nix/store/m7lrha58ph6rcnv109yzx1nk1cj7k7zf-foo.c
+```
+
+# Operation `--add-fixed`
+
+## Synopsis
+
+`nix-store` `--add-fixed` [`--recursive`] *algorithm* *paths…*
+
+## Description
+
+The operation `--add-fixed` adds the specified paths to the Nix store.
+Unlike `--add` paths are registered using the specified hashing
+algorithm, resulting in the same output path as a fixed-output
+derivation. This can be used for sources that are not available from a
+public url or broke since the download expression was written.
+
+This operation has the following options:
+
+ - `--recursive`\
+ Use recursive instead of flat hashing mode, used when adding
+ directories to the store.
+
+## Example
+
+```console
+$ nix-store --add-fixed sha256 ./hello-2.10.tar.gz
+/nix/store/3x7dwzq014bblazs7kq20p9hyzz0qh8g-hello-2.10.tar.gz
+```
+
+# Operation `--verify`
+
+## Synopsis
+
+`nix-store` `--verify` [`--check-contents`] [`--repair`]
+
+## Description
+
+The operation `--verify` verifies the internal consistency of the Nix
+database, and the consistency between the Nix database and the Nix
+store. Any inconsistencies encountered are automatically repaired.
+Inconsistencies are generally the result of the Nix store or database
+being modified by non-Nix tools, or of bugs in Nix itself.
+
+This operation has the following options:
+
+ - `--check-contents`\
+ Checks that the contents of every valid store path has not been
+ altered by computing a SHA-256 hash of the contents and comparing it
+ with the hash stored in the Nix database at build time. Paths that
+ have been modified are printed out. For large stores,
+ `--check-contents` is obviously quite slow.
+
+ - `--repair`\
+ If any valid path is missing from the store, or (if
+ `--check-contents` is given) the contents of a valid path has been
+ modified, then try to repair the path by redownloading it. See
+ `nix-store --repair-path` for details.
+
+# Operation `--verify-path`
+
+## Synopsis
+
+`nix-store` `--verify-path` *paths…*
+
+## Description
+
+The operation `--verify-path` compares the contents of the given store
+paths to their cryptographic hashes stored in Nix’s database. For every
+changed path, it prints a warning message. The exit status is 0 if no
+path has changed, and 1 otherwise.
+
+## Example
+
+To verify the integrity of the `svn` command and all its dependencies:
+
+```console
+$ nix-store --verify-path $(nix-store -qR $(which svn))
+```
+
+# Operation `--repair-path`
+
+## Synopsis
+
+`nix-store` `--repair-path` *paths…*
+
+## Description
+
+The operation `--repair-path` attempts to “repair” the specified paths
+by redownloading them using the available substituters. If no
+substitutes are available, then repair is not possible.
+
+> **Warning**
+>
+> During repair, there is a very small time window during which the old
+> path (if it exists) is moved out of the way and replaced with the new
+> path. If repair is interrupted in between, then the system may be left
+> in a broken state (e.g., if the path contains a critical system
+> component like the GNU C Library).
+
+## Example
+
+```console
+$ nix-store --verify-path /nix/store/dj7a81wsm1ijwwpkks3725661h3263p5-glibc-2.13
+path `/nix/store/dj7a81wsm1ijwwpkks3725661h3263p5-glibc-2.13' was modified!
+ expected hash `2db57715ae90b7e31ff1f2ecb8c12ec1cc43da920efcbe3b22763f36a1861588',
+ got `481c5aa5483ebc97c20457bb8bca24deea56550d3985cda0027f67fe54b808e4'
+
+$ nix-store --repair-path /nix/store/dj7a81wsm1ijwwpkks3725661h3263p5-glibc-2.13
+fetching path `/nix/store/d7a81wsm1ijwwpkks3725661h3263p5-glibc-2.13'...
+…
+```
+
+# Operation `--dump`
+
+## Synopsis
+
+`nix-store` `--dump` *path*
+
+## Description
+
+The operation `--dump` produces a NAR (Nix ARchive) file containing the
+contents of the file system tree rooted at *path*. The archive is
+written to standard output.
+
+A NAR archive is like a TAR or Zip archive, but it contains only the
+information that Nix considers important. For instance, timestamps are
+elided because all files in the Nix store have their timestamp set to 0
+anyway. Likewise, all permissions are left out except for the execute
+bit, because all files in the Nix store have 444 or 555 permission.
+
+Also, a NAR archive is *canonical*, meaning that “equal” paths always
+produce the same NAR archive. For instance, directory entries are
+always sorted so that the actual on-disk order doesn’t influence the
+result. This means that the cryptographic hash of a NAR dump of a
+path is usable as a fingerprint of the contents of the path. Indeed,
+the hashes of store paths stored in Nix’s database (see `nix-store -q
+--hash`) are SHA-256 hashes of the NAR dump of each store path.
+
+NAR archives support filenames of unlimited length and 64-bit file
+sizes. They can contain regular files, directories, and symbolic links,
+but not other types of files (such as device nodes).
+
+A Nix archive can be unpacked using `nix-store
+--restore`.
+
+# Operation `--restore`
+
+## Synopsis
+
+`nix-store` `--restore` *path*
+
+## Description
+
+The operation `--restore` unpacks a NAR archive to *path*, which must
+not already exist. The archive is read from standard input.
+
+# Operation `--export`
+
+## Synopsis
+
+`nix-store` `--export` *paths…*
+
+## Description
+
+The operation `--export` writes a serialisation of the specified store
+paths to standard output in a format that can be imported into another
+Nix store with `nix-store --import`. This is like `nix-store
+--dump`, except that the NAR archive produced by that command doesn’t
+contain the necessary meta-information to allow it to be imported into
+another Nix store (namely, the set of references of the path).
+
+This command does not produce a *closure* of the specified paths, so if
+a store path references other store paths that are missing in the target
+Nix store, the import will fail. To copy a whole closure, do something
+like:
+
+```console
+$ nix-store --export $(nix-store -qR paths) > out
+```
+
+To import the whole closure again, run:
+
+```console
+$ nix-store --import < out
+```
+
+# Operation `--import`
+
+## Synopsis
+
+`nix-store` `--import`
+
+## Description
+
+The operation `--import` reads a serialisation of a set of store paths
+produced by `nix-store --export` from standard input and adds those
+store paths to the Nix store. Paths that already exist in the Nix store
+are ignored. If a path refers to another path that doesn’t exist in the
+Nix store, the import fails.
+
+# Operation `--optimise`
+
+## Synopsis
+
+`nix-store` `--optimise`
+
+## Description
+
+The operation `--optimise` reduces Nix store disk space usage by finding
+identical files in the store and hard-linking them to each other. It
+typically reduces the size of the store by something like 25-35%. Only
+regular files and symlinks are hard-linked in this manner. Files are
+considered identical when they have the same NAR archive serialisation:
+that is, regular files must have the same contents and permission
+(executable or non-executable), and symlinks must have the same
+contents.
+
+After completion, or when the command is interrupted, a report on the
+achieved savings is printed on standard error.
+
+Use `-vv` or `-vvv` to get some progress indication.
+
+## Example
+
+```console
+$ nix-store --optimise
+hashing files in `/nix/store/qhqx7l2f1kmwihc9bnxs7rc159hsxnf3-gcc-4.1.1'
+...
+541838819 bytes (516.74 MiB) freed by hard-linking 54143 files;
+there are 114486 files with equal contents out of 215894 files in total
+```
+
+# Operation `--read-log`
+
+## Synopsis
+
+`nix-store` {`--read-log` | `-l`} *paths…*
+
+## Description
+
+The operation `--read-log` prints the build log of the specified store
+paths on standard output. The build log is whatever the builder of a
+derivation wrote to standard output and standard error. If a store path
+is not a derivation, the deriver of the store path is used.
+
+Build logs are kept in `/nix/var/log/nix/drvs`. However, there is no
+guarantee that a build log is available for any particular store path.
+For instance, if the path was downloaded as a pre-built binary through a
+substitute, then the log is unavailable.
+
+## Example
+
+```console
+$ nix-store -l $(which ktorrent)
+building /nix/store/dhc73pvzpnzxhdgpimsd9sw39di66ph1-ktorrent-2.2.1
+unpacking sources
+unpacking source archive /nix/store/p8n1jpqs27mgkjw07pb5269717nzf5f8-ktorrent-2.2.1.tar.gz
+ktorrent-2.2.1/
+ktorrent-2.2.1/NEWS
+...
+```
+
+# Operation `--dump-db`
+
+## Synopsis
+
+`nix-store` `--dump-db` [*paths…*]
+
+## Description
+
+The operation `--dump-db` writes a dump of the Nix database to standard
+output. It can be loaded into an empty Nix store using `--load-db`. This
+is useful for making backups and when migrating to different database
+schemas.
+
+By default, `--dump-db` will dump the entire Nix database. When one or
+more store paths is passed, only the subset of the Nix database for
+those store paths is dumped. As with `--export`, the user is responsible
+for passing all the store paths for a closure. See `--export` for an
+example.
+
+# Operation `--load-db`
+
+## Synopsis
+
+`nix-store` `--load-db`
+
+## Description
+
+The operation `--load-db` reads a dump of the Nix database created by
+`--dump-db` from standard input and loads it into the Nix database.
+
+# Operation `--print-env`
+
+## Synopsis
+
+`nix-store` `--print-env` *drvpath*
+
+## Description
+
+The operation `--print-env` prints out the environment of a derivation
+in a format that can be evaluated by a shell. The command line arguments
+of the builder are placed in the variable `_args`.
+
+## Example
+
+```console
+$ nix-store --print-env $(nix-instantiate '<nixpkgs>' -A firefox)
+…
+export src; src='/nix/store/plpj7qrwcz94z2psh6fchsi7s8yihc7k-firefox-12.0.source.tar.bz2'
+export stdenv; stdenv='/nix/store/7c8asx3yfrg5dg1gzhzyq2236zfgibnn-stdenv'
+export system; system='x86_64-linux'
+export _args; _args='-e /nix/store/9krlzvny65gdc8s7kpb6lkx8cd02c25c-default-builder.sh'
+```
+
+# Operation `--generate-binary-cache-key`
+
+## Synopsis
+
+`nix-store` `--generate-binary-cache-key` *key-name* *secret-key-file* *public-key-file*
+
+## Description
+
+This command generates an [Ed25519 key pair](http://ed25519.cr.yp.to/)
+that can be used to create a signed binary cache. It takes three
+mandatory parameters:
+
+1. A key name, such as `cache.example.org-1`, that is used to look up
+ keys on the client when it verifies signatures. It can be anything,
+ but it’s suggested to use the host name of your cache (e.g.
+ `cache.example.org`) with a suffix denoting the number of the key
+ (to be incremented every time you need to revoke a key).
+
+2. The file name where the secret key is to be stored.
+
+3. The file name where the public key is to be stored.
diff --git a/doc/manual/src/command-ref/opt-common-syn.md b/doc/manual/src/command-ref/opt-common-syn.md
new file mode 100644
index 000000000..b66d318c2
--- /dev/null
+++ b/doc/manual/src/command-ref/opt-common-syn.md
@@ -0,0 +1,57 @@
+\--help
+
+\--version
+
+\--verbose
+
+\-v
+
+\--quiet
+
+\--log-format
+
+format
+
+\--no-build-output
+
+\-Q
+
+\--max-jobs
+
+\-j
+
+number
+
+\--cores
+
+number
+
+\--max-silent-time
+
+number
+
+\--timeout
+
+number
+
+\--keep-going
+
+\-k
+
+\--keep-failed
+
+\-K
+
+\--fallback
+
+\--readonly-mode
+
+\-I
+
+path
+
+\--option
+
+name
+
+value
diff --git a/doc/manual/src/command-ref/opt-common.md b/doc/manual/src/command-ref/opt-common.md
new file mode 100644
index 000000000..47862bc09
--- /dev/null
+++ b/doc/manual/src/command-ref/opt-common.md
@@ -0,0 +1,219 @@
+# Common Options
+
+Most Nix commands accept the following command-line options:
+
+ - `--help`\
+ Prints out a summary of the command syntax and exits.
+
+ - `--version`\
+ Prints out the Nix version number on standard output and exits.
+
+ - `--verbose` / `-v`\
+ Increases the level of verbosity of diagnostic messages printed on
+ standard error. For each Nix operation, the information printed on
+ standard output is well-defined; any diagnostic information is
+ printed on standard error, never on standard output.
+
+ This option may be specified repeatedly. Currently, the following
+ verbosity levels exist:
+
+ - 0\
+ “Errors only”: only print messages explaining why the Nix
+ invocation failed.
+
+ - 1\
+ “Informational”: print *useful* messages about what Nix is
+ doing. This is the default.
+
+ - 2\
+ “Talkative”: print more informational messages.
+
+ - 3\
+ “Chatty”: print even more informational messages.
+
+ - 4\
+ “Debug”: print debug information.
+
+ - 5\
+ “Vomit”: print vast amounts of debug information.
+
+ - `--quiet`\
+ Decreases the level of verbosity of diagnostic messages printed on
+ standard error. This is the inverse option to `-v` / `--verbose`.
+
+ This option may be specified repeatedly. See the previous verbosity
+ levels list.
+
+ - `--log-format` *format*\
+ This option can be used to change the output of the log format, with
+ *format* being one of:
+
+ - raw\
+ This is the raw format, as outputted by nix-build.
+
+ - internal-json\
+ Outputs the logs in a structured manner.
+
+ > **Warning**
+ >
+ > While the schema itself is relatively stable, the format of
+ > the error-messages (namely of the `msg`-field) can change
+ > between releases.
+
+ - bar\
+ Only display a progress bar during the builds.
+
+ - bar-with-logs\
+ Display the raw logs, with the progress bar at the bottom.
+
+ - `--no-build-output` / `-Q`\
+ By default, output written by builders to standard output and
+ standard error is echoed to the Nix command's standard error. This
+ option suppresses this behaviour. Note that the builder's standard
+ output and error are always written to a log file in
+ `prefix/nix/var/log/nix`.
+
+ - `--max-jobs` / `-j` *number*\
+ Sets the maximum number of build jobs that Nix will perform in
+ parallel to the specified number. Specify `auto` to use the number
+ of CPUs in the system. The default is specified by the `max-jobs`
+ configuration setting, which itself defaults to `1`. A higher
+ value is useful on SMP systems or to exploit I/O latency.
+
+ Setting it to `0` disallows building on the local machine, which is
+ useful when you want builds to happen only on remote builders.
+
+ - `--cores`\
+ Sets the value of the `NIX_BUILD_CORES` environment variable in
+ the invocation of builders. Builders can use this variable at
+ their discretion to control the maximum amount of parallelism. For
+ instance, in Nixpkgs, if the derivation attribute
+ `enableParallelBuilding` is set to `true`, the builder passes the
+ `-jN` flag to GNU Make. It defaults to the value of the `cores`
+ configuration setting, if set, or `1` otherwise. The value `0`
+ means that the builder should use all available CPU cores in the
+ system.
+
+ - `--max-silent-time`\
+ Sets the maximum number of seconds that a builder can go without
+ producing any data on standard output or standard error. The
+ default is specified by the `max-silent-time` configuration
+ setting. `0` means no time-out.
+
+ - `--timeout`\
+ Sets the maximum number of seconds that a builder can run. The
+ default is specified by the `timeout` configuration setting. `0`
+ means no timeout.
+
+ - `--keep-going` / `-k`\
+ Keep going in case of failed builds, to the greatest extent
+ possible. That is, if building an input of some derivation fails,
+ Nix will still build the other inputs, but not the derivation
+ itself. Without this option, Nix stops if any build fails (except
+ for builds of substitutes), possibly killing builds in progress (in
+ case of parallel or distributed builds).
+
+ - `--keep-failed` / `-K`\
+ Specifies that in case of a build failure, the temporary directory
+ (usually in `/tmp`) in which the build takes place should not be
+ deleted. The path of the build directory is printed as an
+ informational message.
+
+ - `--fallback`\
+ Whenever Nix attempts to build a derivation for which substitutes
+ are known for each output path, but realising the output paths
+ through the substitutes fails, fall back on building the derivation.
+
+ The most common scenario in which this is useful is when we have
+ registered substitutes in order to perform binary distribution from,
+ say, a network repository. If the repository is down, the
+ realisation of the derivation will fail. When this option is
+ specified, Nix will build the derivation instead. Thus, installation
+ from binaries falls back on installation from source. This option is
+ not the default since it is generally not desirable for a transient
+ failure in obtaining the substitutes to lead to a full build from
+ source (with the related consumption of resources).
+
+ - `--readonly-mode`\
+ When this option is used, no attempt is made to open the Nix
+ database. Most Nix operations do need database access, so those
+ operations will fail.
+
+ - `--arg` *name* *value*\
+ This option is accepted by `nix-env`, `nix-instantiate`,
+ `nix-shell` and `nix-build`. When evaluating Nix expressions, the
+ expression evaluator will automatically try to call functions that
+ it encounters. It can automatically call functions for which every
+ argument has a [default
+ value](../expressions/language-constructs.md#functions) (e.g.,
+ `{ argName ? defaultValue }: ...`). With `--arg`, you can also
+ call functions that have arguments without a default value (or
+ override a default value). That is, if the evaluator encounters a
+ function with an argument named *name*, it will call it with value
+ *value*.
+
+ For instance, the top-level `default.nix` in Nixpkgs is actually a
+ function:
+
+ ```nix
+ { # The system (e.g., `i686-linux') for which to build the packages.
+ system ? builtins.currentSystem
+ ...
+ }: ...
+ ```
+
+ So if you call this Nix expression (e.g., when you do `nix-env -i
+ pkgname`), the function will be called automatically using the
+ value [`builtins.currentSystem`](../expressions/builtins.md) for
+ the `system` argument. You can override this using `--arg`, e.g.,
+ `nix-env -i pkgname --arg system \"i686-freebsd\"`. (Note that
+ since the argument is a Nix string literal, you have to escape the
+ quotes.)
+
+ - `--argstr` *name* *value*\
+ This option is like `--arg`, only the value is not a Nix
+ expression but a string. So instead of `--arg system
+ \"i686-linux\"` (the outer quotes are to keep the shell happy) you
+ can say `--argstr system i686-linux`.
+
+ - `--attr` / `-A` *attrPath*\
+ Select an attribute from the top-level Nix expression being
+ evaluated. (`nix-env`, `nix-instantiate`, `nix-build` and
+ `nix-shell` only.) The *attribute path* *attrPath* is a sequence
+ of attribute names separated by dots. For instance, given a
+ top-level Nix expression *e*, the attribute path `xorg.xorgserver`
+ would cause the expression `e.xorg.xorgserver` to be used. See
+ [`nix-env --install`](nix-env.md#operation---install) for some
+ concrete examples.
+
+ In addition to attribute names, you can also specify array indices.
+ For instance, the attribute path `foo.3.bar` selects the `bar`
+ attribute of the fourth element of the array in the `foo` attribute
+ of the top-level expression.
+
+ - `--expr` / `-E`\
+ Interpret the command line arguments as a list of Nix expressions to
+ be parsed and evaluated, rather than as a list of file names of Nix
+ expressions. (`nix-instantiate`, `nix-build` and `nix-shell` only.)
+
+ For `nix-shell`, this option is commonly used to give you a shell in
+ which you can build the packages returned by the expression. If you
+ want to get a shell which contain the *built* packages ready for
+ use, give your expression to the `nix-shell -p` convenience flag
+ instead.
+
+ - `-I` *path*\
+ Add a path to the Nix expression search path. This option may be
+ given multiple times. See the `NIX_PATH` environment variable for
+ information on the semantics of the Nix search path. Paths added
+ through `-I` take precedence over `NIX_PATH`.
+
+ - `--option` *name* *value*\
+ Set the Nix configuration option *name* to *value*. This overrides
+ settings in the Nix configuration file (see nix.conf5).
+
+ - `--repair`\
+ Fix corrupted or missing store paths by redownloading or rebuilding
+ them. Note that this is slow because it requires computing a
+ cryptographic hash of the contents of every path in the closure of
+ the build. Also note the warning under `nix-store --repair-path`.
diff --git a/doc/manual/src/command-ref/opt-inst-syn.md b/doc/manual/src/command-ref/opt-inst-syn.md
new file mode 100644
index 000000000..1703c40e3
--- /dev/null
+++ b/doc/manual/src/command-ref/opt-inst-syn.md
@@ -0,0 +1,15 @@
+\--prebuilt-only
+
+\-b
+
+\--attr
+
+\-A
+
+\--from-expression
+
+\-E
+
+\--from-profile
+
+path
diff --git a/doc/manual/src/command-ref/utilities.md b/doc/manual/src/command-ref/utilities.md
new file mode 100644
index 000000000..5ba8a02a3
--- /dev/null
+++ b/doc/manual/src/command-ref/utilities.md
@@ -0,0 +1,3 @@
+# Utilities
+
+This section lists utilities that you can use when you work with Nix.