--- tags: - nix --- Basic invocation: `nix-shell -p [ pkgs ... ]` Nix shells are also used for [[Exposing development headers on Nixos]] # Shebang ``` #! /usr/bin/env nix-shell #! nix-shell -i bash -p bash do stuff ``` Different interpreters can be set with the `-i` option such as python ``` #! /usr/bin/env nix-shell #! nix-shell -i python3 -p python3 print("hello world") ``` The `-I` option can be used to pin nixpkgs ``` #! /usr/bin/env nix-shell #! nix-shell -i bash #! nix-shell -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/aed4b19d312525ae7ca9bceb4e1efe3357d0e2eb.tar.gz echo hello world ``` # Shell.nix Can be used to set up per dir environments, e.g using direnv to automatically activate them. ## Python https://nixos.org/manual/nixpkgs/stable/#python ```nix { pkgs ? import {}}: pkgs.mkShell { packages = [ pkgs.virtualenv ]; } ``` ```nix with import {}; let my_toolz = python311.pkgs.buildPythonPackage rec { pname = "toolz"; version = "0.10.0"; pyproject = true; src = fetchPypi { inherit pname version; hash = "sha256-CP3V73yWSArRHBLUct4hrNMjWZlvaaUlkpm1QP66RWA="; }; nativeBuildInputs = [ python311.pkgs.setuptools python311.pkgs.wheel ]; # has no tests doCheck = false; meta = { homepage = "https://github.com/pytoolz/toolz/"; description = "List processing tools and functional utilities"; # [...] }; }; in python311.withPackages (ps: with ps; [ numpy my_toolz ]) ).env ``` The [[Import]] is required here because imports a nix expression from another source, in this case nixpkgs. It is not required at line two, because python310Packages itself is already in the local scope.