Table des matières
NIX
Documentation
- Nix:
nix-user-chroot
https://github.com/nix-community/nix-user-chroot
Outil qui permet de donner un répertoire qui sera présenter comme point de montage /nix
grâce au namespace en espace utilisateur:
$ mkdir -m 0755 ~/.nix $ nix-user-chroot ~/.nix ${SHELL=bash} -l
Installation
$ sh <(curl https://nixos.org/nix/install)
Pour 1 utilisateur:
$ sh <(curl https://nixos.org/nix/install) --no-daemon
Multi-utilisateurs:
$ sh <(curl https://nixos.org/nix/install) --daemon
Variables
NIX_PATH
NIX_PATH=nixpkgs=/home/gigix/.nix-defexpr/channels/nixpkgs
NIX_PAGER
export NIX_PAGER=
nixpkgs
nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-15.09.tar.gz nixpkgs=channel:nixos-15.09
Fichiers
config.nix
Fichier utilisateur: ~/.nixpkgs/config.nix
Commandes
nox
$ nix-env -i nox $ nox emacs
nix-env
$ nix-env -qasP hello --description $ nix-env -iA nixpkgs.hello $ nix-env -q $ nix-env -qc $ nix-env -u $ nix-env -u --dry-run $ nix-env -e hello
Force a specific channel (master in this example):
$ nix-env -f https://github.com/NixOS/nixpkgs/archive/master.tar.gz -iA hello
$ nix-env --list-generations $ nix-env --rollback switching from generation 3 to 2 $ nix-env -G 3 switching from generation 2 to 3
$ nix-env --switch-profile /nix/var/nix/profiles/gigix $ nix-env --switch-profile /nix/var/nix/profiles/default
- ~/.nixpkgs/config.nix
{ packageOverrides = pkgs: rec { homeEnv = pkgs.buildEnv { name = "homeEnv"; paths = [ pkgs.emacs24 pkgs.bsdgames ]; }; workEnv = pkgs.buildEnv { name = "workEnv"; paths = [ pkgs.emacs23 pkgs.perl ]; }; }; }
$ nix-env -p /nix/var/nix/profiles/per-user/gigix/workEnv -i workEnv $ nix-env -p /nix/var/nix/profiles/per-user/gigix/homeEnv -i homeEnv
$ nix-env -p /nix/var/nix/profiles/other-profile -i subversion
$ nix-env --delete-generations old ... removing generation 73 removing generation 74 removing generation 75 removing generation 76
nix-build
Builder psmisc en 32 bits:
$ nix-build -A psmisc --argstr system i686-linux
$ nix-build '<nixpkgs>' -A stdenv
nix-shell
- shell.nix
{ pkgs ? import <nixpkgs> {} }: with pkgs; mkShell { buildInputs = [ elixir_1_10 nodejs-12_x ]; }
$ nix-shell $ nix-shell shell.nix
$ nix-shell --pure -E 'import <nixpkgs> {}' -A hello $ nix-shell --pure -p hello --run hello
$ nix-shell '<nixpkgs>' -A pan [nix-shell]$ tar xf $src [nix-shell]$ cd pan-* [nix-shell]$ ./configure [nix-shell]$ make [nix-shell]$ ./pan/gui/pan
$ nix-shell '<nixpkgs>' -A emacs --command 'unpackPhase; patchPhase'
Force a specific channel:
$ nix-shell -p hello -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/master.tar.gz
Custom interpreter:
#! /usr/bin/env nix-shell #! nix-shell -i real-interpreter -p packages
#! /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
#! /usr/bin/env nix-shell #! nix-shell -i bash -p "terraform.withPlugins (plugins: [ plugins.openstack ])" terraform apply
#! /usr/bin/env nix-shell #! nix-shell -i runghc -p "haskellPackages.ghcWithPackages (ps: [ps.HTTP ps.tagsoup])" #! nix-shell -I nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-18.03.tar.gz import Network.HTTP import Text.HTML.TagSoup -- Fetch nixos.org and print all hrefs. main = do resp <- Network.HTTP.simpleHTTP (getRequest "http://nixos.org/") body <- getResponseBody resp let tags = filter (isTagOpenName "a") $ parseTags body let tags' = map (fromAttrib "href") tags mapM_ putStrLn $ filter (/= "") tags'
nix-channel
$ nix-channel --list nixpkgs http://nixos.org/channels/nixpkgs-unstable
$ nix-channel --add https://nixos.org/channels/nixos-19.09 nixpkgs_19_09 $ nix-channel --remove nixpkgs_19_09
Master channel:
$ nix-channel --add https://github.com/NixOS/nixpkgs/archive/master.tar.gz master
$ nix-channel --update
nix-store
$ nix-store -q --references `which hello` /nix/store/1ncwrl8bplq3xhmj8pxfkx4y0i90vmnx-glibc-2.30 /nix/store/77gczr7dc287sqdc13gi2zcpwl7960yz-hello-2.10
$ nix-store -qR `which hello` /nix/store/mxaxvp33wg9sim8qh2kkw041v492bvxj-libunistring-0.9.10 /nix/store/hjng28vbd73qq9iz9j8r397x19aa8fp9-libidn2-2.3.0 /nix/store/1ncwrl8bplq3xhmj8pxfkx4y0i90vmnx-glibc-2.30 /nix/store/77gczr7dc287sqdc13gi2zcpwl7960yz-hello-2.10
$ nix-store -q --tree `which hello` /nix/store/77gczr7dc287sqdc13gi2zcpwl7960yz-hello-2.10 +---/nix/store/1ncwrl8bplq3xhmj8pxfkx4y0i90vmnx-glibc-2.30 | +---/nix/store/hjng28vbd73qq9iz9j8r397x19aa8fp9-libidn2-2.3.0 | | +---/nix/store/mxaxvp33wg9sim8qh2kkw041v492bvxj-libunistring-0.9.10 | | | +---/nix/store/mxaxvp33wg9sim8qh2kkw041v492bvxj-libunistring-0.9.10 [...] | | +---/nix/store/hjng28vbd73qq9iz9j8r397x19aa8fp9-libidn2-2.3.0 [...] | +---/nix/store/1ncwrl8bplq3xhmj8pxfkx4y0i90vmnx-glibc-2.30 [...] +---/nix/store/77gczr7dc287sqdc13gi2zcpwl7960yz-hello-2.10 [...]
$ nix-store -q --referrers `which hello` /nix/store/77gczr7dc287sqdc13gi2zcpwl7960yz-hello-2.10 /nix/store/mbd3a74yrg7qvlv5jqz9fss6lkqd314c-env-manifest.nix /nix/store/x3asfl3l7zn7lnwkbz5iahs789zk9lx1-user-environment
Show all paths that depend on the same OpenSSL library as svn:
Afficher tous les chemins qui dépendent de la même bibliothèque OpenSSL que svn:
$ 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
Pour un paquet non installé:
$ nix-store --query --references $(nix-instantiate '<nixpkgs>' -A emacs)
Vérifier le store:
$ nix-store --verify --check-contents reading the Nix store... checking path existence... checking hashes...
Réparer le store:
$ nix-store --verify --check-contents --repair
Il est parfois nécessaire de modifier le store manuellement:
$ nix-store --add-fixed sha256 /path/to/file
Optimiser le store pour gagner en place:
$ nix-store --optimise
Suppression d'une dérivation non désirée:
$ nix-store --delete /nix/store/31icg8jxiyxkcmx8gwak3fvq9shi6fd8-hello-2.8 finding garbage collector roots... removing stale link from '/nix/var/nix/gcroots/auto/8m1kkl216mxi8yn9pgn009838qil7mlv' to '/etc/nixos/result' deleting '/nix/store/31icg8jxiyxkcmx8gwak3fvq9shi6fd8-hello-2.8' deleting '/nix/store/trash' deleting unused links... note: currently hard linking saves -0.00 MiB 1 store paths deleted, 0.18 MiB freed
nix-collect-garbage
C'est un alias de nix-store –gc
.
$ nix-collect-garbage ... deleting '/nix/store/gazpv90zhld15svbkbfi17nd182f63nm-webencodings-0.5.1.tar.gz.drv' deleting '/nix/store/la6n976p7nmk9ijkjff2i040nc24knql-setenv-0.1.1.3-r1.cabal.drv' deleting '/nix/store/g85ssgjv1i5djy8589444fhlyxnhnqcp-splitmix-0.0.3-r1.cabal.drv' deleting '/nix/store/trash' deleting unused links... note: currently hard linking saves -0.00 MiB 2419 store paths deleted, 2308.54 MiB freed
$ nix-collect-garbage--delete-older-than 30d
nix-prefetch-url
$ nix-prefetch-url --unpack https://github.com/gigi206/salt/archive/742781c358d65c8849a6a6f5b8f4bb3dcefc203a.tar.gz unpacking... [14.5 MiB DL] path is '/nix/store/2l5az5rvkkavrr7zgghgqpmsqj3vn1yp-742781c358d65c8849a6a6f5b8f4bb3dcefc203a.tar.gz' 02cgs6b1rmh8hmcwm5wpxxg32p3km9c05606pykv49qq1spd6p38
nix-instantiate
$ nix-instantiate --eval -E '(import <nixpkgs> {}).vscode.version' "1.43.0"
$ nix-instantiate --eval -E '(import <nixpkgs> {}).lib.version' "20.09pre216928.991bbef6835"
nix
nix show-derivation
$ nix show-derivation '((import <nixpkgs> {}).hello)' { "/nix/store/17abmzvc6qq1yhi01aac11jpznrnndqv-hello-2.10.drv": { "outputs": { "out": { "path": "/nix/store/77gczr7dc287sqdc13gi2zcpwl7960yz-hello-2.10" } }, "inputSrcs": [ "/nix/store/9krlzvny65gdc8s7kpb6lkx8cd02c25b-default-builder.sh" ], "inputDrvs": { "/nix/store/7cipdvw2s5sz1px8x3hv41j40753969s-bash-4.4-p23.drv": [ "out" ], "/nix/store/hzd53xaaqkh0jib90hv31ixjgxrlppi9-stdenv-linux.drv": [ "out" ], "/nix/store/j5zjn5ymk44wyf27gfgfwgs4yj2pylnz-hello-2.10.tar.gz.drv": [ "out" ] }, "platform": "x86_64-linux", "builder": "/nix/store/1iaxkm0941nj1m4m5g4fxgg4cq5jckf0-bash-4.4-p23/bin/bash", "args": [ "-e", "/nix/store/9krlzvny65gdc8s7kpb6lkx8cd02c25b-default-builder.sh" ], "env": { "buildInputs": "", "builder": "/nix/store/1iaxkm0941nj1m4m5g4fxgg4cq5jckf0-bash-4.4-p23/bin/bash", "configureFlags": "", "depsBuildBuild": "", "depsBuildBuildPropagated": "", "depsBuildTarget": "", "depsBuildTargetPropagated": "", "depsHostHost": "", "depsHostHostPropagated": "", "depsTargetTarget": "", "depsTargetTargetPropagated": "", "doCheck": "1", "doInstallCheck": "", "name": "hello-2.10", "nativeBuildInputs": "", "out": "/nix/store/77gczr7dc287sqdc13gi2zcpwl7960yz-hello-2.10", "outputs": "out", "patches": "", "pname": "hello", "propagatedBuildInputs": "", "propagatedNativeBuildInputs": "", "src": "/nix/store/3x7dwzq014bblazs7kq20p9hyzz0qh8g-hello-2.10.tar.gz", "stdenv": "/nix/store/0w5454az7vwcq60yqvcsv8fs9q7r4zrx-stdenv-linux", "strictDeps": "", "system": "x86_64-linux", "version": "2.10" } } }
nix run
$ nix run nixpkgs.hello --command hello
Equivalent à:
$ nix-shell --pure -p hello --run hello
nix search
$ nix search hello
nix path-info
$ nix path-info --recursive --closure-size nixpkgs.hello | sort --numeric-sort --key 2 /nix/store/mxaxvp33wg9sim8qh2kkw041v492bvxj-libunistring-0.9.10 1634416 /nix/store/hjng28vbd73qq9iz9j8r397x19aa8fp9-libidn2-2.3.0 1857088 /nix/store/1ncwrl8bplq3xhmj8pxfkx4y0i90vmnx-glibc-2.30 32939352 /nix/store/77gczr7dc287sqdc13gi2zcpwl7960yz-hello-2.10 33145320
$ readlink -f $(which hello)
nix repl
$ nix repl '<nixpkgs>' Welcome to Nix version 2.3.3. Type :? for help. nix-repl> builtins.currentSystem "x86_64-linux"
$ nix repl nix-repl> :l <nixpkgs> nix-repl> simple = derivation { name = "simple"; builder = "${bash}/bin/bash"; args = [ ./simple_builder.sh ]; gcc = gcc; coreutils = coreutils; src = ./simple.c; system = builtins.currentSystem; } nix-repl> :b simple this derivation produced the following outputs: out -> /nix/store/ni66p4jfqksbmsl616llx3fbs1d232d4-simple
nix-repl> (builtins.parseDrvName "NUnit.Console-3.0.1").name "NUnit.Console"
nix edit
Permet d'éditer un build avant de l'installer ([|https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-edit.html|nix edit]]):
$ EDITOR=vim nix edit -f "<nixpkgs>" samba --extra-experimental-features nix-command
On install ensuite le paquet:
$ nix-env -i samba
nix language
Nombres (int / float)
$ nix eval '(1 + 1)'
$ nix eval '(builtins.typeOf 1)' "int" $ nix eval '(builtins.typeOf 1.0)' "float"
Chaines (string)
$ nix eval "('' line 1 line 2 line 3 '')"
$ nix eval '("a" + "b")' "ab"
variables (let)
$ nix eval '(let a = 1; b = 2; in a + b)' 3 $ nix eval '( let foo = "Foo"; bar = "Bar"; in "${foo + bar} is a terrible name")' "FooBar is a terrible name"
Conditions (if)
nix-repl> a = 3 nix-repl> b = 4 nix-repl> if a > b then "yes" else "no" "no"
Fonctions (lambda)
$ nix eval '((a: a + 1) 2)' 3
Listes (list)
$ nix eval '([1 2] ++ [3 4])' [ 1 2 3 4 ]
Set
$ nix eval '({ foo = 1; bar = 2; }.bar)' 2 $ nix eval '({ foo = 1; bar = 2; } // { bar = 3; baz = 4; })' { bar = 3; baz = 4; foo = 1; } $ nix eval '(rec { foo = bar; bar = 2; }.foo)' 2 $ nix eval '(({ foo, bar }: foo + bar ) { foo = 1; bar = 2; })' 3 $ nix eval '(({ foo, ...}: foo + 2 ) { foo = 3; bar = 4; })' 5 $ nix eval '((s@{ foo, bar }: foo + s.bar ) { foo = 2; bar = 3; }) 5 $ nix eval '(let a = 3; in { a = a; })' { a = 3; } $ let a = 3; in { b = a; inherit a; })' { a = 3; b = 3; }
Chemins (path)
$ nix eval '(some/path)' /home/gigix/some/path $ nix eval '(./some/path)' /home/gigix/some/path $ nix eval '(/some/path)' /some/path $ nix eval '(<nixpkgs>)' /home/gigix/.nix-defexpr/channels/nixpkgs
Imports
$ nix eval '(import <nixpkgs>)' <LAMBDA>
Restaurer le binaire nix (recovery)
$ nix-env -e '*' uninstalling 'hello-2.10' uninstalling 'nix-2.1.3' [...] $ ls -l /nix/store/*-nix-*/bin/nix-env lrwxrwxrwx. 1 gigix gigix 3 1 janv. 1970 /nix/store/ddmmzn4ggz1f66lwxjy64n89864yj9w9-nix-2.3.3/bin/nix-env -> nix $ /nix/store/ddmmzn4ggz1f66lwxjy64n89864yj9w9-nix-2.3.3/bin/nix-env -i /nix/store/ddmmzn4ggz1f66lwxjy64n89864yj9w9-nix-2.3.3/bin/nix-env
Dérivations
Simple dérivation
- simple1.nix
with (import <nixpkgs> {}); derivation { name = "simple"; builder = "${bash}/bin/bash"; args = [ ./simple_builder.sh ]; inherit gcc coreutils; src = ./simple.c; system = builtins.currentSystem; }
- simple2.nix
with (import <nixpkgs> {}); derivation { name = "hello"; builder = "${bash}/bin/bash"; args = [ ./hello_builder.sh ]; inherit gnutar gzip gnumake gcc coreutils gawk gnused gnugrep; binutils = binutils-unwrapped; src = ./hello-2.10.tar.gz; system = builtins.currentSystem; }
Créer un fichier de fonction autotools.nix
:
- autotools.nix
pkgs: attrs: with pkgs; let defaultAttrs = { builder = "${bash}/bin/bash"; args = [ ./builder.sh ]; baseInputs = [ gnutar gzip gnumake gcc binutils-unwrapped coreutils gawk gnused gnugrep ]; buildInputs = []; system = builtins.currentSystem; }; in derivation (defaultAttrs // attrs)
- autotools.nix
pkgs: attrs: with pkgs; let defaultAttrs = { builder = "${bash}/bin/bash"; args = [ ./builder.sh ]; baseInputs = [ gnutar gzip gnumake gcc binutils-unwrapped coreutils gawk gnused gnugrep ]; buildInputs = []; system = builtins.currentSystem; }; in derivation (defaultAttrs // attrs)
nix-repl> { a = "b"; } // { c = "d"; } { a = "b"; c = "d"; } nix-repl> { a = "b"; } // { a = "c"; } { a = "c"; }
- hello.nix
let pkgs = import <nixpkgs> {}; mkDerivation = import ./autotools.nix pkgs; in mkDerivation { name = "hello"; src = ./hello-2.10.tar.gz; }
Override
$ nix repl nix-repl> :l <nixpkgs> Added 4360 variables. nix-repl> :b graphviz.override { xlibs = null; }
{ packageOverrides = pkgs: { graphviz = pkgs.graphviz.override { xlibs = null; }; }; }
buildInputs
$ nix-build exemple1.nix
- exemple1.nix
let nixpkgs = import <nixpkgs> {}; inherit (nixpkgs) stdenv fetchurl which; actualHello = stdenv.mkDerivation { name = "hello-2.3"; src = fetchurl { url = mirror://gnu/hello/hello-2.3.tar.bz2; sha256 = "0c7vijq8y68bpr7g6dh1gny0bff8qq81vnp4ch8pjzvg56wb3js1"; }; }; wrappedHello = stdenv.mkDerivation { name = "hello-wrapper"; buildInputs = [ actualHello which ]; unpackPhase = "true"; installPhase = '' mkdir -p "$out/bin" echo "#! ${stdenv.shell}" >> "$out/bin/hello" echo "exec $(which hello)" >> "$out/bin/hello" ''; }; in wrappedHell
propagatedBuildInputs
$ nix-build exemple2.nix
- exemple2.nix
let nixpkgs = import <nixpkgs> {}; inherit (nixpkgs) stdenv fetchurl which; actualHello = stdenv.mkDerivation { name = "hello-2.3"; src = fetchurl { url = mirror://gnu/hello/hello-2.3.tar.bz2; sha256 = "0c7vijq8y68bpr7g6dh1gny0bff8qq81vnp4ch8pjzvg56wb3js1"; }; }; intermediary = stdenv.mkDerivation { name = "middle-man"; propagatedBuildInputs = [ actualHello ]; unpackPhase = "true"; installPhase = '' mkdir -p "$out" ''; }; wrappedHello = stdenv.mkDerivation { name = "hello-wrapper"; buildInputs = [ intermediary which ]; unpackPhase = "true"; installPhase = '' mkdir -p "$out/bin" echo "#! ${stdenv.shell}" >> "$out/bin/hello" echo "exec $(which hello)" >> "$out/bin/hello" ''; }; in wrappedHello
shellHook
- test.nix
with import <nixpkgs> {}; stdenv.mkDerivation { name = "my-environment"; buildInputs = [ pkgs.figlet pkgs.lolcat ]; # The '' quotes are 2 single quote characters # They are used for multi-line strings shellHook = '' figlet "Welcome!" | lolcat --freq 0.5 ''; }
$ nix-shell test.nix __ __ _ _ \ \ / /__| | ___ ___ _ __ ___ ___| | \ \ /\ / / _ \ |/ __/ _ \| '_ ` _ \ / _ \ | \ V V / __/ | (_| (_) | | | | | | __/_| \_/\_/ \___|_|\___\___/|_| |_| |_|\___(_)
builder
{ stdenv, fetchurl, openmpi }: stdenv.mkDerivation rec { name = "oned"; src = fetchurl { url = "https://www.pdc.kth.se/education/tutorials/mpi/hybrid-lab/oned.c"; sha256 = "<HASH_HERE>"; }; buildInputs = [ openmpi ]; builder = builtins.toFile "builder.sh" " source $stdenv/setup mpicc -w -o oned.exe $src mkdir $out mkdir $out/bin cp oned.exe $out/bin "; meta = { description = "JDEV 2017 Nix tutoriel"; license = stdenv.lib.licenses.gpl2; platforms = stdenv.lib.platforms.unix; }; }
Overlays
Pour ajouter un paquet personnel ou pour modifier un paquet déjà existant, Nix permet d'ajouter des overlays.
Il s'agit de fichiers Nix que l'on place dans le dossier ~/.config/nixpkgs/overlays/
. Ces overlays sont alors appliqués automatiquement sur la logithèque.
Si on ajoute le fichier ~/.config/nixpkgs/overlays/monOverlay1.nix
suivant, on modifie le paquet boost de la logithèque et on y ajoute un paquet monAppli:
- ~/.config/nixpkgs/overlays/monOverlay1.nix
self: super: { boost = super.boost.override { python = self.python3; }; monAppli = super.callPackage ./pkgs/monAppli.nix {}; }
Dans cet overlay, self
et super
sont les paramètres de la fonction à appliquer sur la logithèque d’entrée, super
est la version initiale de la logithèque et self
la version modifiée.
Ces modifications seront alors automatiquement appliquées, par exemple si on installe un de ces paquets ou si on lance un nix-shell qui les utilisent.
self: super: { nano-no-nls = super.nano.override { enableNls = false; }; }
Nix permet de modifier les paquets encore plus profondément. Par exemple, on peut modifier le paquet existant nano de façon à utiliser la version 4.5 du code source de nano:
self: super: { nano = super.nano.overrideAttrs (oldAttrs: rec { pname = oldAttrs.pname; version = "4.5"; src = super.fetchurl { url = "mirror://gnu/nano/${pname}-${version}.tar.xz"; sha256 = "0czmz1yq8s5qcxcmfjdxzg9nkhbmlc9q1nz04jvf57fdbs7w7mfy"; }; }); }
home-manager
Le but d'home-manager est de fournir l'équivalent du fichier /etc/nixos/configuration.nix
mais pour l'environnement utilisateur (au lieu de l'environnement système). Plus précisemment, l'utilisateur décrit sa configuration via un fichier ~/.config/nixpkgs/home.nix
et lance une commande home-manager pour construire et installer la configuration correspondante.
$ nix-env -iA nixos.home-manager
- ~/.config/nixpkgs/home.nix
{ pkgs, ... }: { home.packages = with pkgs; [ geany meld vlc ]; home.keyboard = { layout = "fr"; variant = "bepo"; }; }
Prise en compte de la configuration:
$ home-manager switch
Séparer:
- ~/.config/nixpkgs/packages.nix
{ pkgs, ... }: { home.packages = with pkgs; [ geany meld vlc ]; }
- ~/.config/nixpkgs/home.nix
{ pkgs, ... }: { imports = [ ./packages.nix ]; home.keyboard = { layout = "fr"; variant = "bepo"; }; }
Autre exemple:
{ pkgs, ... }: { programs = { firefox.enable = true; .git = { enable = true; userName = "gigix"; userEmail = "gigix@example.com"; ignores = [ "*~" "*.swp" ]; }; bash = { enable = true; shellAliases = { ll = "ls -lh"; la = "ls -a"; }; }; }; }