Aller au contenu

Nushell

Shell moderne à données structurées qui traite la sortie des commandes comme des tables et prend en charge les pipelines avec des données typées, le filtrage et les scripts multiplateformes.

CommandeDescription
brew install nushellInstaller sur macOS avec Homebrew
cargo install nuInstaller depuis crates.io
winget install nushellInstaller sur Windows avec winget
sudo apt install nushellInstaller sur Debian/Ubuntu
pacman -S nushellInstaller sur Arch Linux
nix-env -i nushellInstaller sur NixOS
nuLancer Nushell
nu --versionAfficher la version installée
nu -c "ls"Exécuter une seule commande et quitter
nu script.nuExécuter un fichier script Nushell
chsh -s /usr/bin/nuDéfinir Nushell comme shell par défaut
CommandeDescription
sysAfficher les informations système complètes
sys hostAfficher les détails de l’hôte (nom, OS, noyau)
sys memAfficher l’utilisation de la mémoire
sys cpuAfficher les informations du processeur
sys disksAfficher l’utilisation des disques
sys netAfficher les interfaces réseau
sys tempAfficher les capteurs de température
date nowAfficher la date et l’heure actuelles
date now | format date "%Y-%m-%d"Formater la date actuelle
$nu.home-pathAfficher le chemin du répertoire personnel
$nu.os-infoAfficher les détails du système d’exploitation
CommandeDescription
lsLister les fichiers sous forme de table structurée
ls -lListe détaillée avec informations
ls -aAfficher les fichiers cachés
ls **/*.rsGlob récursif pour les fichiers Rust
ls | where size > 1mbFiltrer les fichiers de plus de 1 Mo
ls | where type == dirFiltrer les répertoires uniquement
ls | sort-by modified -rTrier par date de modification (plus récent en premier)
ls | sort-by size -rTrier par taille décroissante
ls | get nameObtenir uniquement la colonne des noms de fichiers
CommandeDescription
psLister les processus sous forme de table
ps | where cpu > 10Trouver les processus utilisant plus de 10% du CPU
ps | where name =~ "node"Trouver les processus par motif de nom
ps | sort-by mem -r | first 10Top 10 des processus par mémoire
ps | where pid == 1234Trouver un processus par PID
CommandeDescription
helpAfficher l’aide générale
help commandsLister toutes les commandes disponibles
help lsAfficher l’aide pour une commande spécifique
help operatorsLister les opérateurs disponibles
help escapesAfficher les séquences d’échappement de chaînes
CommandeDescription
ls | select name sizeSélectionner des colonnes spécifiques
ls | reject modifiedSupprimer des colonnes spécifiques
ls | rename filename filesizeRenommer des colonnes
ls | first 5Obtenir les 5 premières lignes
ls | last 3Obtenir les 3 dernières lignes
ls | skip 10Ignorer les 10 premières lignes
ls | lengthCompter le nombre de lignes
ls | reverseInverser l’ordre des lignes
ls | shuffleMélanger l’ordre des lignes
ls | flattenAplatir les tables imbriquées
ls | columnsLister les noms de colonnes
CommandeDescription
ls | where size > 1mbFiltrer par comparaison
ls | where name =~ "test"Filtrer par correspondance regex
ls | where name starts-with "src"Filtrer par préfixe
ls | where name ends-with ".md"Filtrer par suffixe
ls | where type in ["file" "dir"]Filtrer par liste de valeurs
ls | sort-by size -rTrier par ordre décroissant
ls | sort-by name -iTrier sans tenir compte de la casse
ls | uniq-by typeSupprimer les doublons par colonne
ls | group-by typeRegrouper les lignes par valeur de colonne
CommandeDescription
ls | each { |it| $it.name }Transformer chaque ligne
ls | par-each { |it| $it.name }Transformer en parallèle
ls | update size { |it| $it.size / 1kb }Mettre à jour les valeurs d’une colonne
ls | insert label { |it| $it.name + "-file" }Ajouter une nouvelle colonne
ls | reduce -f 0 { |it, acc| $acc + $it.size }Accumuler des valeurs
ls | enumerateAjouter une colonne d’index
ls | window 3Fenêtre glissante de 3 lignes
ls | zip [1 2 3]Fusionner avec une autre liste
ls | transposeÉchanger lignes et colonnes
CommandeDescription
42Entier
3.14Flottant
"hello"Chaîne de caractères
true / falseBooléen
nullValeur nulle
2024-01-15Date
5sec / 3min / 2hrDurée
1kb / 5mb / 2gbTaille de fichier
0b1010Littéral binaire
0xffLittéral hexadécimal
CommandeDescription
[1 2 3]Liste
[1 2 3] | append 4Ajouter à la fin d’une liste
[1 2 3] | prepend 0Ajouter au début d’une liste
{name: "Alice", age: 30}Enregistrement
{a: 1} | merge {b: 2}Fusionner des enregistrements
[[name age]; ["Alice" 30] ["Bob" 25]]Littéral de table
0..9Intervalle (0 à 9)
0..<9Intervalle exclusif (0 à 8)
0..2..10Intervalle avec pas (0, 2, 4, 6, 8, 10)
CommandeDescription
"42" | into intChaîne vers entier
"3.14" | into floatChaîne vers flottant
42 | into stringNombre vers chaîne
"true" | into boolChaîne vers booléen
"2024-01-15" | into datetimeChaîne vers date/heure
1024 | into filesizeNombre vers taille de fichier
5 | into duration --unit secNombre vers durée
42 | into binaryNombre vers binaire
[1 2 3] | into recordListe vers enregistrement
{a: 1} | into recordConvertir en enregistrement
CommandeDescription
open data.jsonOuvrir et analyser un fichier JSON
open data.csvOuvrir et analyser un fichier CSV
open data.yamlOuvrir et analyser un fichier YAML
open data.tomlOuvrir et analyser un fichier TOML
open data.xmlOuvrir et analyser un fichier XML
open data.tsvOuvrir et analyser un fichier TSV
open data.sqliteOuvrir une base de données SQLite
open file.txtOuvrir en texte brut
open data.json | get usersOuvrir et naviguer dans les données
CommandeDescription
"hello" | save hello.txtSauvegarder une chaîne dans un fichier
ls | save files.jsonSauvegarder une table en JSON
ls | save files.csvSauvegarder une table en CSV
ls | save files.yamlSauvegarder une table en YAML
open data.json | to csvConvertir JSON en CSV
open data.csv | to jsonConvertir CSV en JSON
open data.json | save data.yamlConvertir entre formats
open data.csv | save -f data.csvForcer l’écrasement d’un fichier existant
"line1\nline2" | save -a log.txtAjouter à un fichier
CommandeDescription
open file.txt | linesDiviser un fichier en lignes
open file.txt | lines | lengthCompter les lignes d’un fichier
open file.csv | where status == "active"Filtrer les lignes d’un CSV
open file.json | select name emailSélectionner des champs d’un JSON
open file.json | to yaml | save file.yamlConvertir JSON en YAML
glob "**/*.md" | each { |f| open $f }Ouvrir tous les fichiers correspondants
CommandeDescription
"hello world" | str upcaseConvertir en majuscules
"HELLO" | str downcaseConvertir en minuscules
"hello" | str capitalizeMettre la première lettre en majuscule
" hello " | str trimSupprimer les espaces
"hello" | str trim --char "h"Supprimer un caractère spécifique
"hello" | str reverseInverser une chaîne
CommandeDescription
"hello world" | str replace "world" "nu"Remplacer la première occurrence
"aabaa" | str replace -a "a" "x"Remplacer toutes les occurrences
"hello world" | str replace -r '\w+' 'word'Remplacer avec une regex
"hello world" | str contains "world"Vérifier si la chaîne contient
"hello world" | str starts-with "hello"Vérifier le préfixe
"hello world" | str ends-with "world"Vérifier le suffixe
"hello world" | str index-of "world"Trouver la position d’une sous-chaîne
CommandeDescription
"hello world" | split row " "Diviser par délimiteur
"a,b,c" | split row ","Diviser une chaîne style CSV
"hello" | split charsDiviser en caractères
["hello" "world"] | str join " "Joindre une liste en chaîne
["a" "b" "c"] | str join ","Joindre avec une virgule
"hello" | str lengthObtenir la longueur d’une chaîne
"hello world" | str substring 0..5Extraire une sous-chaîne
# Interpolation de base
let name = "World"
$"Hello, ($name)!"

# Interpolation d'expressions
$"Total: (1 + 2 + 3)"

# Chaînes multi-lignes
$"Line 1
Line 2
Line 3"

# Chaînes brutes (pas d'échappement)
r#'C:\Users\path'#
CommandeDescription
def greet [name: string] { $"Hello, ($name)!" }Commande personnalisée de base
def add [a: int, b: int] -> int { $a + $b }Commande avec annotations de type
def greet [name = "World"] { ... }Commande avec paramètre par défaut
def "git branches" [] { git branch | lines }Nom de type sous-commande
def --wrapped cmd [...rest] { ... }Accepter des arguments supplémentaires
CommandeDescription
let x = 42Variable immuable
mut x = 0; $x = $x + 1Variable mutable
const PI = 3.14159Constante de compilation
if $x > 0 { "pos" } else { "neg" }Expression conditionnelle
match $x { 1 => "one", 2 => "two", _ => "other" }Correspondance de motifs
for item in [1 2 3] { print $item }Boucle for
while $x < 10 { $x = $x + 1 }Boucle while
loop { if $x > 10 { break }; $x += 1 }Boucle infinie avec break
try { risky_op } catch { "failed" }Gestion des erreurs
# Fonction avec paramètre drapeau
def greet [
  name: string       # Nom à saluer
  --excited (-e)     # Utiliser un point d'exclamation
] {
  if $excited {
    $"Hello, ($name)!"
  } else {
    $"Hello, ($name)."
  }
}

# Fonction avec paramètres rest
def sum [...nums: int] -> int {
  $nums | math sum
}

# Fonction avec entrée pipeline
def double-all [] {
  each { |x| $x * 2 }
}
# Utilisation : [1 2 3] | double-all
CommandeDescription
[1 2 3 4 5] | math sumSomme des valeurs
[1 2 3 4 5] | math avgMoyenne des valeurs
[1 2 3 4 5] | math minValeur minimale
[1 2 3 4 5] | math maxValeur maximale
[1 2 3 4 5] | math medianValeur médiane
[1 2 3 4 5] | math stddevÉcart type
[1 2 3 4 5] | math varianceVariance
[1 2 3] | math productProduit des valeurs
10 | math absValeur absolue
10 | math sqrtRacine carrée
2 | math round -p 2Arrondir à la précision
10 | math log 2Logarithme base 2
CommandeDescription
http get https://api.example.com/dataRequête GET
http post https://api.example.com/data {name: "test"}Requête POST avec JSON
http put https://api.example.com/data/1 {name: "updated"}Requête PUT
http delete https://api.example.com/data/1Requête DELETE
http get url --headers [Accept application/json]GET avec en-têtes personnalisés
http get url | get dataGET et extraire un champ
port 8080Vérifier si un port est utilisé
# Récupérer et traiter une API JSON
let users = (http get "https://jsonplaceholder.typicode.com/users")
$users | select name email | first 5

# POST avec en-têtes et corps
http post "https://api.example.com/items" {
  name: "New Item"
  price: 29.99
} --headers [Authorization $"Bearer ($env.API_TOKEN)"]
CommandeDescription
$nu.config-pathAfficher le chemin du fichier de configuration
$nu.env-pathAfficher le chemin de la configuration d’environnement
$nu.default-config-dirAfficher le répertoire de configuration
config nuOuvrir la configuration dans l’éditeur
config envOuvrir la configuration d’environnement dans l’éditeur
CommandeDescription
$env.config.show_banner = falseDésactiver la bannière de démarrage
$env.config.buffer_editor = "vim"Définir l’éditeur pour Ctrl+O
$env.config.history.file_format = "sqlite"Utiliser l’historique SQLite
$env.config.history.max_size = 100_000Définir le nombre maximum d’entrées
$env.config.completions.external.enable = trueActiver les complétions externes
$env.config.cursor_shape.emacs = "line"Définir la forme du curseur
$env.config.footer_mode = "25"Afficher le pied de page pour les grandes tables
$env.config.table.mode = "rounded"Définir le style de bordure des tables
CommandeDescription
$env.PATH = ($env.PATH | prepend "/usr/local/bin")Ajouter au début du PATH
$env.PATH = ($env.PATH | append "~/.local/bin")Ajouter à la fin du PATH
$env.EDITOR = "vim"Définir une variable d’environnement
alias ll = ls -lCréer un alias de commande
source ~/.config/nushell/custom.nuCharger une configuration supplémentaire
# env.nu — configuration de l'environnement
$env.PATH = ($env.PATH | split row (char esep)
  | prepend "/usr/local/bin"
  | prepend ($env.HOME | path join ".cargo" "bin")
  | append ($env.HOME | path join "go" "bin")
)

$env.EDITOR = "nvim"
$env.VISUAL = "nvim"
$env.PAGER = "less"
# config.nu — configuration du shell
$env.config = {
  show_banner: false
  buffer_editor: "nvim"
  table: {
    mode: rounded
    index_mode: auto
    trim: {
      methodology: wrapping
      wrapping_try_keep_words: true
    }
  }
  history: {
    file_format: "sqlite"
    max_size: 100_000
    sync_on_enter: true
    isolation: false
  }
  completions: {
    case_sensitive: false
    quick: true
    partial: true
    algorithm: "prefix"
    external: {
      enable: true
      max_results: 100
    }
  }
}
CommandeDescription
module greet { export def hello [] { "hi" } }Définir un module en ligne
use greet helloImporter une commande depuis un module
use greet *Importer tout depuis un module
use utils.nuImporter depuis un fichier module
overlay use spamActiver un overlay
overlay hide spamDésactiver un overlay
overlay listLister les overlays actifs
# fichier : utils.nu
export def "str kebab" [] {
  $in | str downcase | str replace -a " " "-"
}

export def "str title" [] {
  $in | split row " "
  | each { |w| $w | str capitalize }
  | str join " "
}

# Utilisation :
# use utils.nu
# "Hello World" | str kebab    # "hello-world"
# "hello world" | str title    # "Hello World"
CommandeDescription
open data.dbOuvrir une base de données SQLite
open data.db | query db "SELECT * FROM users"Exécuter une requête SQL
open data.db | query db "SELECT * FROM users WHERE age > 30"Requête filtrée
open data.db | schemaAfficher le schéma de la base de données
[[name age]; ["Alice" 30]] | into sqlite data.dbCréer un SQLite depuis une table
ls | into sqlite -t files data.dbSauvegarder une table dans SQLite
CommandeDescription
plugin listLister les plugins installés
plugin add /path/to/pluginEnregistrer un plugin
plugin rm plugin_nameSupprimer un plugin
plugin use plugin_nameCharger un plugin
cargo install nu_plugin_formatsInstaller le plugin formats
cargo install nu_plugin_queryInstaller le plugin query
cargo install nu_plugin_gstatInstaller le plugin git status
  1. Utiliser les données structurées — Nushell excelle lorsque vous travaillez avec des tables et des enregistrements plutôt que des chaînes brutes. Utilisez select, where et sort-by au lieu de grep et awk.

  2. Typer les paramètres des fonctions — Ajoutez des annotations de type aux commandes personnalisées (name: string, count: int) pour détecter les erreurs tôt et améliorer l’autocomplétion.

  3. Préférer les variables immuables — Utilisez let par défaut et n’utilisez mut que lorsque vous avez vraiment besoin de mutation. Cela évite les changements d’état accidentels dans les scripts.

  4. Utiliser l’historique SQLite — Définissez $env.config.history.file_format = "sqlite" pour des recherches plus rapides, une meilleure résistance à la corruption et des métadonnées plus riches.

  5. Tirer parti de par-each pour la performance — Lors du traitement de nombreux éléments indépendants, par-each s’exécute en threads parallèles et peut être significativement plus rapide que each.

  6. Utiliser les modules pour le code réutilisable — Organisez les commandes personnalisées en fichiers de modules .nu et utilisez use plutôt que source. Les modules ont un espace de noms et des exports appropriés.

  7. Utiliser into pour les conversions de types — Utilisez toujours la conversion de type explicite (into int, into string, etc.) plutôt que de compter sur la coercition implicite pour des scripts fiables.

  8. Configurer les complétions — Activez les complétions externes et carapace pour la prise en charge de l’autocomplétion shell pour tous les outils CLI.

  9. Utiliser l’interpolation de chaînes — Préférez $"Hello, ($name)!" à la concaténation de chaînes avec + pour un code plus propre et plus lisible.

  10. Gérer les erreurs avec try/catch — Encapsulez les opérations qui peuvent échouer (accès fichier, HTTP, analyse) dans des blocs try { } catch { } pour des scripts robustes.

  11. Tester avec describe — Utilisez expression | describe pour inspecter le type de n’importe quelle valeur pendant le développement et le débogage.

  12. Utiliser les closures de manière cohérente — Les closures Nushell utilisent la syntaxe { |params| body }. Incluez toujours les caractères pipe même pour les paramètres uniques pour plus de clarté.