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 comanda ls (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 per dir 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'entorn HOME.
  • putStrLn $ "La teva carpeta d'inici és: " ++ home: Imprimeix el valor de la variable d'entorn HOME.

Nota

  • En Windows, podeu utilitzar la variable USERPROFILE en lloc de HOME.

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 comanda cat (o type 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 per type 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 per findstr 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.

© Copyright 2024. Tots els drets reservats