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" :
"engine": la culture de ce moteur (utilisée en interne pour le formatage/parsing nombre-texte —tostring,string.format, la conversion implicite chaîne/nombre, etc.), partagée par le script principal et toutes ses coroutines. Toujours modifiable, sans permission particulière de l'hôte — ça n'affecte que ce moteur."process": la culture de tout le processus .NET qui héberge le moteur (CultureInfo.CurrentCulture/DefaultThreadCurrentCulture) — visible en dehors du moteur, par le reste de l'application hôte. Sa lecture (os.getculture("process")) est toujours possible, mais la modifier (os.setculture(..., "process")) est refusée par défaut parDefaultHost(même logique queos.execute/os.exit) : un hôte doit explicitement l'autoriser.
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.