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 outputExplicació 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
lsperdirper 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: " ++ homeExplicació 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
USERPROFILEen 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(otypeen 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
catpertypeper 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: " ++ outputExercici 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
grepperfindstrper 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.
