Aller au contenu
Administration Linux medium

Commandes Nix modernes : search, shell, run, build, profile

14 min de lecture

Les commandes Nix modernes (nix search, nix shell, nix run, nix build, nix profile) remplacent les anciens outils (nix-env, nix-build, nix-shell) avec une interface unifiée et des sorties plus lisibles. Ce guide couvre le flux de travail quotidien : chercher un paquet, le tester sans l'installer, l'ajouter au profil, le construire localement, et inspecter ses métadonnées. Chaque commande est illustrée avec des exemples testés sur une Debian 12 avec Nix 2.34.

  • Chercher un paquet dans nixpkgs avec nix search
  • Lancer un binaire temporaire avec nix shell et nix run
  • Gérer les paquets installés avec nix profile (ajout, suppression, mise à jour)
  • Construire un paquet localement avec nix build
  • Inspecter les métadonnées et dépendances d'un paquet
  • Connaître les commandes utilitaires (nix eval, nix path-info, nix why-depends)

Les commandes modernes sont activées par l'option experimental-features = nix-command flakes dans /etc/nix/nix.conf. Elles couvrent l'essentiel des besoins quotidiens :

  • tester un outil rapidement sans polluer le système (démonstration, debug, comparaison de versions),
  • installer des outils utilisateur sans droits root et sans conflits de dépendances,
  • construire un projet de manière reproductible avant de le déployer,
  • inspecter les dépendances d'un paquet avant de l'embarquer dans un conteneur ou une VM.

nix search interroge un flake dont vous devez donner le nom en premier argument, ici nixpkgs. C'est ce qui la distingue de apt search : la commande ne cherche pas dans « les paquets disponibles » en général, mais dans la collection que vous désignez. Le nom exact retourné, par exemple legacyPackages.x86_64-linux.htop, est celui que les autres commandes Nix attendront ensuite.

Le terme est cherché dans le nom et la description des paquets, ce qui explique le nombre de résultats sur un mot courant.

Fenêtre de terminal
nix search nixpkgs htop
Résultat (extrait)
* legacyPackages.x86_64-linux.htop (3.4.1)
* legacyPackages.x86_64-linux.htop-vim (3.4.1)
* legacyPackages.x86_64-linux.neohtop (1.2.0)

La première évaluation de nixpkgs prend 30 à 60 secondes (évaluation de l'arbre complet). Les recherches suivantes utilisent un cache local et sont quasi instantanées.

nix search accepte des expressions régulières pour affiner :

Fenêtre de terminal
nix search nixpkgs "^python3$"

Cette commande retourne uniquement le paquet dont le nom correspond exactement à python3, sans les variantes (python3Packages.*, python3Full…).

Pour obtenir la description d'un paquet :

Fenêtre de terminal
nix eval nixpkgs#hello.meta.description
Résultat
"Program that produces a familiar, friendly greeting"

Ces deux commandes téléchargent le paquet dans le store et le rendent exécutable immédiatement, sans jamais toucher au profil ni au système. C'est l'usage qui remplace le classique « j'installe pour essayer, je désinstallerai plus tard » : rien n'est à désinstaller puisque rien n'a été installé. Le paquet occupe malgré tout de l'espace disque jusqu'au prochain garbage collection.

nix shell ouvre un nouveau shell avec les paquets demandés dans le $PATH. Rien n'est installé dans le profil :

Fenêtre de terminal
nix shell nixpkgs#cowsay -c cowsay "Nix shell temporaire"
Résultat
______________________
< Nix shell temporaire >
----------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||

Après exécution, cowsay n'est plus disponible :

Fenêtre de terminal
which cowsay
# cowsay not found

L'option -c exécute une commande unique et quitte. Sans -c, un shell interactif s'ouvre avec les paquets dans le $PATH.

Chaque paquet supplémentaire s'ajoute comme un argument distinct, préfixé de son flake : il n'y a pas de séparateur ni de liste à quoter.

Fenêtre de terminal
nix shell nixpkgs#jq nixpkgs#curl -c sh -c 'curl -s https://api.github.com/repos/NixOS/nix | jq .stargazers_count'

Les deux paquets sont disponibles dans le même shell temporaire.

nix run télécharge le paquet et exécute son binaire principal sans ouvrir de shell :

Fenêtre de terminal
nix run nixpkgs#bat -- --version
Résultat
bat 0.26.1

Le -- sépare les arguments de nix run de ceux passés au binaire.

Les quatre formes ci-dessous se distinguent sur deux points : est-ce qu'un shell est ouvert, et est-ce que plusieurs paquets sont accessibles. Retenez que nix run ne lance que le binaire principal déclaré par le paquet, ce qui exclut les outils annexes qu'il installe par ailleurs ; dans ce cas, il faut passer par nix shell.

CommandeComportementCas d'usage
nix shell nixpkgs#outilOuvre un shell avec outil dans le $PATHExplorer, lancer plusieurs commandes
nix shell nixpkgs#outil -c cmdExécute cmd dans un shell temporaireScript, pipeline
nix run nixpkgs#outilExécute le binaire principal directementTest rapide, one-shot
nix run nixpkgs#outil -- argsExécute avec des argumentsVérifier une version, lancer un serveur

Le profil est l'ensemble des paquets rendus disponibles en permanence pour votre compte, sans droits root et sans conflit avec ceux de la distribution. Chaque opération y crée une génération numérotée, ce qui rend l'installation et la désinstallation réversibles. Les sous-commandes suivent la même logique que n'importe quel gestionnaire de paquets : add, list, remove, upgrade.

Aucun sudo n'est nécessaire : le paquet est ajouté au profil de l'utilisateur courant, pas au système.

Fenêtre de terminal
nix profile add nixpkgs#fd

fd est maintenant disponible de manière permanente dans votre $PATH :

Fenêtre de terminal
fd --version
Résultat
fd 10.4.2

La sortie donne pour chaque entrée le chemin dans le store, seule façon de connaître la version réellement installée, le nom du paquet ne la contenant pas.

Fenêtre de terminal
nix profile list
Résultat
Name: fd
Flake attribute: legacyPackages.x86_64-linux.fd
Store paths: /nix/store/836lndidk1144z81npf27c7dcgmczid3-fd-10.4.2
Name: jq
Flake attribute: legacyPackages.x86_64-linux.jq
Store paths: /nix/store/fc13hvlj7541i1xmwdka7f61qicdzr5a-jq-1.8.1-bin
Name: ripgrep
Flake attribute: legacyPackages.x86_64-linux.ripgrep
Store paths: /nix/store/922crn2k3v8yaqk7anps80hba919lnds-ripgrep-15.1.0

La suppression se fait par nom de paquet, pas par la référence flake complète utilisée à l'installation.

Fenêtre de terminal
nix profile remove fd
Résultat
removing 'flake:nixpkgs#legacyPackages.x86_64-linux.fd'
removed 1 packages, kept 2 packages

Le binaire fd disparaît du $PATH immédiatement. Le paquet reste dans le store jusqu'au garbage collection.

Pour mettre à jour un paquet spécifique :

Fenêtre de terminal
nix profile upgrade ripgrep

Pour mettre à jour tous les paquets du profil :

Fenêtre de terminal
nix profile upgrade '.*'

Chaque opération sur le profil crée une génération. Consultez l'historique et revenez en arrière si nécessaire :

Fenêtre de terminal
nix profile history
Fenêtre de terminal
nix profile rollback # revient à la génération précédente
nix profile rollback --to 2 # bascule vers une génération spécifique

nix build produit un paquet dans le store sans l'ajouter au profil, donc sans le rendre disponible dans le $PATH. En pratique la construction est souvent instantanée : Nix vérifie d'abord si le résultat existe déjà dans le cache binaire public et se contente alors de le télécharger. La compilation locale n'a lieu que si aucune version pré-construite ne correspond exactement.

nix build construit (ou télécharge depuis le cache) un paquet et crée un lien symbolique result dans le répertoire courant :

Fenêtre de terminal
nix build nixpkgs#hello
Fenêtre de terminal
ls -la result
Résultat
result -> /nix/store/10s5j3mfdg22k1597x580qrhprnzcjwb-hello-2.12.3
Fenêtre de terminal
./result/bin/hello
Résultat
Hello, world!

Le lien result agit comme une racine GC : tant qu'il existe, le paquet ne sera pas supprimé par le garbage collector.

Sans lien result, il n'y a plus de racine GC : le paquet construit devient éligible à la suppression au prochain garbage collection.

Fenêtre de terminal
nix build nixpkgs#hello --no-link

Le paquet est construit dans le store mais aucun lien result n'est créé. Utile pour pré-remplir le cache sans encombrer le répertoire courant.

Ces trois commandes répondent aux questions qui se posent avant d'embarquer un paquet dans une image de conteneur ou une VM : combien pèse-t-il une fois ses dépendances comptées, pourquoi tire-t-il telle bibliothèque, et comment est-il construit. Aucune ne modifie le profil ni le système.

Sans option, la commande n'affiche que le chemin ; il faut -s pour la taille propre, -S pour la closure et -h pour des unités lisibles.

Fenêtre de terminal
nix path-info nixpkgs#ripgrep
Résultat
/nix/store/922crn2k3v8yaqk7anps80hba919lnds-ripgrep-15.1.0

Avec les tailles (propre et closure) :

Fenêtre de terminal
nix path-info -sSh nixpkgs#ripgrep
Résultat
/nix/store/922crn2k3v8yaqk7anps80hba919lnds-ripgrep-15.1.0 6.4 MiB 54.3 MiB

La première colonne est la taille propre du paquet, la seconde sa taille de closure (toutes dépendances incluses).

Pour comprendre pourquoi un paquet dépend d'un autre :

Fenêtre de terminal
nix why-depends nixpkgs#ripgrep nixpkgs#pcre2

Cette commande affiche la chaîne de dépendances qui relie ripgrep à pcre2.

La sortie est un JSON volumineux, d'où le head -5 de l'exemple ; la redirection 2>&1 récupère au passage les messages d'évaluation émis sur la sortie d'erreur.

Fenêtre de terminal
nix derivation show nixpkgs#hello 2>&1 | head -5
Résultat (extrait)
{"derivations":{"7mdg60drrnh0wq1j8hmmbhll47czm107-hello-2.12.3.drv":{
"args":["-e","...source-stdenv.sh","...default-builder.sh"],
"builder":"/nix/store/v8sa6r6q037ihghxfbwzjj4p59v2x0pv-bash-5.3p9/bin/bash",
...

Une dérivation est la recette complète pour construire un paquet : sources, dépendances, builder, variables d'environnement. C'est l'élément fondamental qui garantit la reproductibilité.

La colonne de droite est la plus utile au quotidien : elle sépare les commandes qui laissent le système inchangé de celles qui créent une nouvelle génération de profil. Les premières sont sans conséquence et peuvent être essayées librement ; les secondes se défont avec nix profile rollback.

CommandeUsageModifie le profil ?
nix search nixpkgs <terme>Chercher un paquetNon
nix shell nixpkgs#pkgShell temporaire avec le paquetNon
nix run nixpkgs#pkgExécuter le binaire principalNon
nix build nixpkgs#pkgConstruire et créer ./resultNon
nix profile add nixpkgs#pkgInstaller dans le profilOui
nix profile remove pkgDésinstaller du profilOui
nix profile upgrade pkgMettre à jourOui
nix profile listLister les paquets installésNon
nix profile historyHistorique des générationsNon
nix profile rollbackRevenir à la génération précédenteOui
nix eval nixpkgs#pkg.attrÉvaluer une expressionNon
nix path-info nixpkgs#pkgChemin et taille dans le storeNon
nix why-depends A BTracer une dépendanceNon
nix derivation show nixpkgs#pkgAfficher la recette (.drv)Non

Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

6 questions
6 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

  • nix search explore les 100 000+ paquets de nixpkgs, la première évaluation est lente, les suivantes sont instantanées.
  • nix shell et nix run permettent de tester un outil sans l'installer, idéal pour le débogage ou la comparaison de versions.
  • nix profile gère les paquets installés de manière permanente avec un historique complet et un rollback atomique.
  • nix build construit un paquet et crée un lien result, utile pour inspecter ou déployer le résultat.
  • Les commandes utilitaires (eval, path-info, why-depends, derivation show) aident à comprendre la composition d'un paquet.
  • Toutes ces commandes utilisent la syntaxe nixpkgs#paquet pour désigner un paquet, c'est une référence flake qui sera détaillée dans le guide dédié.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn