En aquest tema, aprendrem com interactuar amb el sistema operatiu des de Haskell. Això inclou executar comandes del sistema, treballar amb variables d'entorn i gestionar processos. Aquestes habilitats són essencials per a la creació d'aplicacions que necessiten comunicar-se amb el sistema operatiu o altres programes.
Continguts
Executar Comandes del Sistema
Per executar comandes del sistema des de Haskell, utilitzarem el mòdul System.Process
. Aquest mòdul proporciona funcions per executar comandes i capturar la seva sortida.
Exemple: Executar una Comanda Simple
import System.Process main :: IO () main = do -- Executa la comanda 'ls' (o 'dir' en Windows) i captura la sortida output <- readProcess "ls" [] "" putStrLn output
Explicació del Codi
import System.Process
: Importa el mòdul necessari per executar comandes del sistema.readProcess "ls" [] ""
: Executa la comandals
(llista els fitxers en el directori actual) i captura la seva sortida.putStrLn output
: Imprimeix la sortida de la comanda.
Nota
- En Windows, podeu substituir
ls
perdir
per obtenir un resultat similar.
Treballar amb Variables d'Entorn
Les variables d'entorn són utilitzades pel sistema operatiu per emmagatzemar informació que pot ser utilitzada per diferents processos. En Haskell, podem accedir i modificar aquestes variables utilitzant el mòdul System.Environment
.
Exemple: Llegir una Variable d'Entorn
import System.Environment main :: IO () main = do -- Llegeix la variable d'entorn 'HOME' home <- getEnv "HOME" putStrLn $ "La teva carpeta d'inici és: " ++ home
Explicació del Codi
import System.Environment
: Importa el mòdul necessari per treballar amb variables d'entorn.getEnv "HOME"
: Llegeix el valor de la variable d'entornHOME
.putStrLn $ "La teva carpeta d'inici és: " ++ home
: Imprimeix el valor de la variable d'entornHOME
.
Nota
- En Windows, podeu utilitzar la variable
USERPROFILE
en lloc deHOME
.
Gestió de Processos
A més d'executar comandes simples, també podem gestionar processos més complexos, incloent la creació de processos, la comunicació amb ells i la seva terminació.
Exemple: Crear i Comunicar-se amb un Procés
import System.Process import System.IO main :: IO () main = do -- Crea un procés per executar la comanda 'cat' (o 'type' en Windows) (Just hin, Just hout, _, ph) <- createProcess (proc "cat" []) { std_in = CreatePipe, std_out = CreatePipe } -- Escriu al procés hPutStrLn hin "Hola, món!" hClose hin -- Llegeix la sortida del procés output <- hGetContents hout putStrLn output -- Espera que el procés acabi waitForProcess ph return ()
Explicació del Codi
createProcess (proc "cat" []) { std_in = CreatePipe, std_out = CreatePipe }
: Crea un procés per executar la comandacat
(otype
en Windows) amb pipes per a l'entrada i la sortida.hPutStrLn hin "Hola, món!"
: Escriu "Hola, món!" al procés.hClose hin
: Tanca el pipe d'entrada.hGetContents hout
: Llegeix la sortida del procés.putStrLn output
: Imprimeix la sortida del procés.waitForProcess ph
: Espera que el procés acabi.
Nota
- En Windows, podeu substituir
cat
pertype
per obtenir un resultat similar.
Exercicis Pràctics
Exercici 1: Executar una Comanda del Sistema
Escriu un programa que executi la comanda date
(o date /T
en Windows) i imprimeixi la data actual.
Solució
import System.Process main :: IO () main = do output <- readProcess "date" [] "" putStrLn $ "La data actual és: " ++ output
Exercici 2: Llegir i Modificar una Variable d'Entorn
Escriu un programa que llegeixi la variable d'entorn PATH
, l'imprimeixi, afegeixi un nou directori al PATH
i imprimeixi el nou valor de PATH
.
Solució
import System.Environment main :: IO () main = do path <- getEnv "PATH" putStrLn $ "PATH original: " ++ path let newPath = path ++ ":/nou/directori" setEnv "PATH" newPath newPath' <- getEnv "PATH" putStrLn $ "PATH modificat: " ++ newPath'
Exercici 3: Crear i Comunicar-se amb un Procés
Escriu un programa que creï un procés per executar la comanda grep
(o findstr
en Windows), li passi una cadena de text i imprimeixi la sortida del procés.
Solució
import System.Process import System.IO main :: IO () main = do (Just hin, Just hout, _, ph) <- createProcess (proc "grep" ["Hola"]) { std_in = CreatePipe, std_out = CreatePipe } hPutStrLn hin "Hola, món!" hPutStrLn hin "Adéu, món!" hClose hin output <- hGetContents hout putStrLn output waitForProcess ph return ()
Nota
- En Windows, podeu substituir
grep
perfindstr
per obtenir un resultat similar.
Conclusió
En aquesta secció, hem après com interactuar amb el sistema operatiu des de Haskell. Hem vist com executar comandes del sistema, treballar amb variables d'entorn i gestionar processos. Aquestes habilitats són essencials per a la creació d'aplicacions que necessiten comunicar-se amb el sistema operatiu o altres programes. A continuació, passarem a la gestió d'excepcions en Haskell.