Aller au contenu
Administration Linux medium

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

10 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.
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"

nix shell — un shell temporaire avec des paquets

Section intitulée « nix shell — un shell temporaire avec des paquets »

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.

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.

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
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
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
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 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.

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.

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.

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é.

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
  • 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 tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn