Un shell moderne qui traite tout comme des données structurées au lieu de texte brut. Les pipelines fonctionnent avec des tableaux, des enregistrements et des listes — pas seulement des chaînes. Pensez-y comme un shell qui comprend nativement JSON, CSV, TOML et YAML.
| Plateforme | Commande |
|---|
| macOS (Homebrew) | brew install nushell |
| Windows (Winget) | winget install nushell |
| Windows (Chocolatey) | choco install nushell |
| Windows (Scoop) | scoop install nu |
| Ubuntu/Debian | sudo apt install nushell (ou télécharger depuis les releases GitHub) |
| Arch Linux | sudo pacman -S nushell |
| Fedora/RHEL | sudo dnf install nushell |
| Cargo (Toutes plateformes) | cargo install nu |
| Nix | nix-env -iA nixpkgs.nushell |
Lancement : Exécutez nu depuis n’importe quel shell pour démarrer Nushell. Définir comme shell par défaut : chsh -s $(which nu)
Les pipelines Nushell passent des données structurées (tableaux, enregistrements, listes), pas du texte :
# Shell traditionnel : texte → grep → awk → texte
# Nushell : tableau → where → select → tableau
ls | where size > 1mb | sort-by size --reverse | first 5
Types de données : chaînes, entiers, flottants, booléens, dates, durées, tailles de fichiers, listes, enregistrements, tableaux
| Commande | Description |
|---|
ls | Lister le répertoire comme un tableau structuré |
ls -la | Lister tous les fichiers (y compris cachés) au format long |
cd path/to/dir | Changer de répertoire |
cp source dest | Copier des fichiers ou répertoires |
mv source dest | Déplacer ou renommer des fichiers |
rm file | Supprimer des fichiers |
mkdir dirname | Créer un répertoire |
open file.json | Ouvrir un fichier comme données structurées (détecte automatiquement le format) |
open file.csv | Ouvrir un CSV comme tableau |
open file.toml | Ouvrir un TOML comme enregistrement |
save output.json | Sauvegarder la sortie du pipeline dans un fichier |
cat file.txt | Afficher le contenu du fichier comme texte |
ps | Afficher les processus en cours comme tableau |
sys | Afficher les informations système |
which command | Trouver l’emplacement de la commande |
help commands | Lister toutes les commandes disponibles |
help <command> | Afficher l’aide pour une commande spécifique |
| Commande | Description |
|---|
ls | where size > 10mb | Filtrer les fichiers supérieurs à 10 Mo |
ls | where name =~ "\.rs$" | Filtrer par regex sur le nom de fichier |
ls | where type == "dir" | Afficher uniquement les répertoires |
ls | where modified > 2day | Fichiers modifiés dans les 2 derniers jours |
ls | select name size | Afficher uniquement les colonnes name et size |
ls | reject type | Supprimer la colonne type |
ls | get name | Extraire uniquement la colonne name comme liste |
ls | first 5 | Afficher les 5 premières entrées |
ls | last 3 | Afficher les 3 dernières entrées |
ls | skip 10 | Sauter les 10 premières entrées |
ls | nth 0 2 4 | Sélectionner les entrées par index |
ls | length | Compter le nombre d’entrées |
ls | uniq | Supprimer les entrées en double |
| Commande | Description |
|---|
ls | sort-by size | Trier par taille croissante |
ls | sort-by size --reverse | Trier par taille décroissante |
ls | sort-by name | Trier alphabétiquement |
ls | group-by type | Grouper les entrées par type |
ls | group-by {get name | path parse | get extension} | Grouper par extension de fichier |
| Commande | Description |
|---|
"hello world" | str upcase | Convertir en majuscules |
"HELLO" | str downcase | Convertir en minuscules |
" hello " | str trim | Supprimer les espaces blancs |
"hello" | str contains "ell" | Vérifier si la chaîne contient une sous-chaîne |
"hello" | str replace "l" "L" | Remplacer des caractères |
"hello world" | split row " " | Diviser la chaîne en liste |
["hello" "world"] | str join ", " | Joindre une liste en chaîne |
"hello" | str length | Obtenir la longueur de la chaîne |
"hello" | str starts-with "he" | Vérifier le préfixe de la chaîne |
| Commande | Description |
|---|
open data.json | get field_name | Accéder à un champ dans JSON |
open data.json | get nested.field | Accéder à des champs imbriqués |
{name: "Alice", age: 30} | Créer un enregistrement |
[1 2 3 4 5] | Créer une liste |
[[name age]; [Alice 30] [Bob 25]] | Créer un tableau |
$data | to json | Convertir en JSON |
$data | to csv | Convertir en CSV |
$data | to toml | Convertir en TOML |
$data | to yaml | Convertir en YAML |
$data | to md | Convertir en tableau Markdown |
| Commande | Description |
|---|
[1 2 3 4] | math sum | Somme des valeurs |
[1 2 3 4] | math avg | Moyenne des valeurs |
[1 2 3 4] | math max | Valeur maximale |
[1 2 3 4] | math min | Valeur minimale |
[1 2 3 4] | math median | Valeur médiane |
ls | get size | math sum | Taille totale des fichiers listés |
1 + 2 | Arithmétique de base |
10 / 3 | Division |
2 ** 8 | Exponentiation |
| Commande | Description |
|---|
http get https://api.example.com/data | Récupérer une URL et analyser la réponse |
http post https://api.example.com/data {key: "value"} | Requête POST avec corps |
fetch url | get field | Récupérer et extraire un champ spécifique |
# Variables (immuables par défaut)
let name = "Alice"
let count = 42
let files = (ls | where size > 1mb)
# Variables mutables
mut counter = 0
$counter += 1
# If/else
if $count > 10 { "big" } else { "small" }
# Boucles
for file in (ls) { print $file.name }
ls | each { |row| $row.name | str upcase }
# Commandes personnalisées (fonctions)
def greet [name: string] { $"Hello, ($name)!" }
greet "World"
| Fichier | Objectif |
|---|
$nu.config-path | Configuration principale (config.nu) |
$nu.env-path | Configuration d’environnement (env.nu) |
# Afficher l'emplacement du fichier de configuration
$nu.config-path
# Éditer la configuration
config nu # Ouvrir config.nu dans l'éditeur
config env # Ouvrir env.nu dans l'éditeur
# Dans config.nu
$env.config = {
show_banner: false # Désactiver la bannière de bienvenue
table: {
mode: rounded # Style de tableau : rounded, compact, thin, none
}
completions: {
algorithm: "fuzzy" # Complétion à la tabulation floue
}
history: {
max_size: 10000 # Entrées d'historique à conserver
file_format: "sqlite" # sqlite ou plaintext
}
}
# Trouver les fichiers les plus volumineux dans un projet
ls **/* | where type == "file" | sort-by size --reverse | first 20
# Analyser et interroger une API JSON
http get https://api.github.com/repos/nushell/nushell | select stargazers_count forks_count
# Convertir entre formats
open data.csv | to json | save data.json
# Analyser des fichiers de log
open access.log | lines | parse "{ip} - - [{date}] \"{method} {path} {proto}\" {status} {size}"
| where status == "404" | group-by path | sort-by -r
# Aperçu rapide du système
sys | get host
ps | sort-by cpu --reverse | first 10
| Fonctionnalité | Bash/Zsh | Nushell |
|---|
| Modèle de données | Flux de texte | Tableaux structurés |
| Analyse de sortie | grep, awk, sed | where, select, get intégrés |
| Gestion JSON | Nécessite jq | Natif (open file.json) |
| Gestion des erreurs | Codes de sortie | Messages d’erreur riches |
| Complétion à la tabulation | Basique | Contextuelle |
| Système de types | Aucun | Entiers, chaînes, dates, tailles, etc. |
| Courbe d’apprentissage | Familier | Nouvelle syntaxe à apprendre |
| Commandes externes | Natif | Entièrement supportées |