Bibliothèque os

La bibliothèque os donne accès à l'horloge, aux variables d'environnement, au système de fichiers et au contrôle de processus (exécution de commande, sortie du process hôte).

Prérequis : une bibliothèque non ouverte automatiquement

Contrairement à coroutine/package/regex/debug, os n'est pas incluse dans OpenLibs() : toutes ses fonctions délèguent à l'hôte .NET (IScriptHost) — horloge, système de fichiers, contrôle de processus — et tous les hôtes ne veulent pas exposer cet accès à un script. L'hôte doit appeler explicitement OpenOSLib() pour l'activer :

// côté hôte .NET
script.OpenLibs();
script.OpenOSLib();   // active 'os' pour ce moteur

Si l'hôte n'a pas ouvert la bibliothèque, require("os") échoue comme n'importe quel searcher qui ne trouve pas de module (l'erreur remonte comme une erreur script normale — utilisez pcall(require, "os") pour la récupérer sous forme de nil, message) :

local ok, err = pcall(require, "os")
if not ok then
    print("os indisponible : " .. tostring(err))
end

Même une fois os ouverte, certaines fonctions restent conditionnées à ce que l'hôte les supporte réellement (voir os.execute/os.exit plus bas) : le DefaultHost fourni par le moteur refuse par défaut l'exécution de commande et la sortie du process — un hôte doit explicitement surcharger ce comportement pour les activer.

Vue d'ensemble

Fonction Description
os.time([table]) Horodatage Unix courant, ou celui décrit par table
os.date([format [, time]]) Formate time (défaut : maintenant) en chaîne ou en table
os.difftime(t2, t1) Différence en secondes entre deux horodatages
os.clock() Temps CPU consommé par le processus, en secondes
os.getenv(varname) Valeur d'une variable d'environnement, ou nil
os.tmpname() Chemin d'un nom de fichier temporaire unique
os.remove(filename) Supprime un fichier
os.rename(oldname, newname) Renomme/déplace un fichier
os.execute([command]) Exécute une commande shell (si l'hôte le permet)
os.exit([code [, close]]) Termine le processus hôte (si l'hôte le permet)
os.getculture([scope]) Nom de la culture courante (moteur ou processus)
os.setculture(name [, scope]) Change la culture (moteur, ou processus si l'hôte le permet)
os.cultures() Liste des cultures reconnues par os.setculture

os.time([table])

Sans argument, retourne l'horodatage Unix courant (secondes écoulées depuis l'epoch), fourni par l'horloge de l'hôte.

Avec une table (champs year, month, day obligatoires, hour [défaut 12], min/sec [défaut 0] optionnels), calcule l'horodatage correspondant à cette date/heure locale. Retourne nil si la date est hors des bornes représentables (par exemple day = 32) plutôt que de lever une erreur.

print(os.time())                                       --> 1755  (ex.)
print(os.time({ year = 2026, month = 8, day = 11 }))

os.date([format [, time]])

Formate time (par défaut l'instant courant) selon format (par défaut "%c"). Si format commence par "!", le formatage utilise l'heure UTC (le ! est retiré du gabarit).

Si format vaut exactement "*t" (ou "!*t" pour l'UTC), retourne une table avec les champs year, month, day, hour, min, sec, wday (1 = dimanche), yday, isdst — plutôt qu'une chaîne.

Sinon, format est un gabarit strftime-like :

Spécificateur Signification
%a / %A Jour de semaine abrégé / complet
%b, %h / %B Mois abrégé / complet
%c Date-heure complète (ddd MMM d HH:mm:ss yyyy)
%d Jour du mois (2 chiffres)
%H / %I Heure 24h / 12h (2 chiffres)
%j Jour de l'année (3 chiffres)
%m Mois (2 chiffres)
%M Minute (2 chiffres)
%n / %t Saut de ligne / tabulation
%p AM/PM
%S Seconde (2 chiffres)
%w Jour de semaine numérique (0 = dimanche)
%x / %X Date courte / heure courte
%y / %Y Année sur 2 / 4 chiffres
%Z Fuseau horaire (UTC ou décalage)
%% % littéral

%U/%W (numéro de semaine) ne sont pas implémentés — leurs conventions de première semaine varient trop selon les régions pour un choix univoque. Un spécificateur inconnu est une erreur.

print(os.date("%Y-%m-%d"))          --> 2026-08-11
print(os.date("!%Y-%m-%dT%H:%M:%SZ"))  --> heure UTC, format ISO 8601
local t = os.date("*t")
print(t.year, t.month, t.day)

os.difftime(t2, t1)

Retourne t2 - t1 (en secondes, comme une simple soustraction sur des horodatages Unix).

os.clock()

Retourne le temps CPU consommé par le processus hôte depuis son démarrage, en secondes.

os.getenv(varname)

Retourne la valeur de la variable d'environnement varname, ou nil si elle n'est pas définie.

os.tmpname()

Retourne un chemin de fichier temporaire unique fourni par l'hôte (le fichier n'est pas forcément créé — voir io.tmpfile pour un fichier temporaire déjà ouvert et auto-supprimé).

os.remove(filename) / os.rename(oldname, newname)

Suppriment/renomment un fichier via l'hôte. En cas de succès, retournent true. En cas d'échec (fichier absent, permission refusée, erreur disque...), retournent nil plus un message d'erreur plutôt que de lever une erreur script :

local ok, err = os.remove("temp.txt")
if not ok then print("échec : " .. err) end

os.execute([command])

Sans argument, retourne true/false selon que l'hôte dispose d'un shell de commande (IScriptHost.HasCommandShell).

Avec command, l'exécute via le shell de l'hôte et retourne trois valeurs : true (code de sortie 0) ou nil (sinon), la chaîne "exit", et le code de sortie du processus. Si l'hôte ne supporte pas l'exécution de commandes (DefaultHost la refuse par défaut), retourne nil plus un message d'erreur plutôt que d'exécuter quoi que ce soit.

os.exit([code [, close]])

Termine le processus hôte avec le code de sortie code (entier, ou true/false convertis en 0/1, par défaut 0). Refusé par défaut par DefaultHost — l'hôte doit explicitement autoriser cette opération pour qu'un script puisse arrêter le processus qui l'héberge.

os.getculture([scope]) / os.setculture(name [, scope]) / os.cultures()

scope distingue deux portées, "engine" (par défaut) ou "process" :

os.getculture([scope]) retourne le nom de la culture courante (ex. "fr-FR", "" pour la culture invariante).

os.setculture(name [, scope]) change la culture vers name (doit être un nom reconnu — voir os.cultures()). Retourne true en cas de succès ; nil plus un message si name n'est pas reconnu, ou si scope vaut "process" et que l'hôte ne l'autorise pas.

os.cultures() retourne un tableau de { name=, displayname= }, une entrée par culture reconnue — dans le même esprit que io.encodings().

print(os.getculture())              --> "" (culture invariante, par défaut)
print(os.setculture("fr-FR"))       --> true
print(string.format("%.2f", 3.5))   --> 3,50  (virgule décimale française)

local ok, err = os.setculture("fr-FR", "process")
if not ok then print("refusé : " .. err) end

Écarts par rapport à Lua

os.setlocale n'est pas exposée : .NET n'a pas d'équivalent au découpage par catégorie de la locale C runtime (LC_TIME, LC_NUMERIC, ...), seulement une notion de culture (CultureInfo) unique — il n'y a donc rien de fidèle à quoi relier les catégories Lua ("all", "time", "numeric", etc.). Le besoin réel qui en motive l'usage est couvert autrement, voir os.getculture/os.setculture/os.cultures ci-dessus.