16 May
duccio

duccio il 16 May 2007 parla di Rails Snippet

Ruby e comandi Bash

Non so se vi è mai capitato di richiamare da un modello un comando della bash?! Beh a me è successo e le cose si sono complicate quando, oltre a questo, ho tirato in mezzo i Thread.

Partiamo dall’inizio innanzi tutto se volete usare i comandi della bash dovete lanciare il comado exec; supponiamo di fare le prove da irb, provate a lanciare:

    1 exec 'ls'

Il risultato è l’elenco dei file e delle cartelle di root:

Shell

Fin qui tutto a posto, non ci sono particolari problemi. Se usate i Thread potrebbero verificarsi degli errori con Mac osX che rispetto a linux (Debian) ha una gestione diversa. Infatti vediamo cosa succede quando lancio un Thread da irb su mac (Tiger 10.0.4) e su debian.

Su Mac si verifica il seguente errore dopo aver istanziato il Thread con Thread.new {}:

Shell2

Vedete che da l’errore:

    1 Errno::EOPNOTSUPP: Operation not supported - ls
    2         from (irb):2:in `exec'
    3         from (irb):2
    4         from :0

Ciò avviene perchè il Ruby crea un posix thread-level thread che non permette semplicemente di capire quale proceso killare quando un altro thread dello stesso process ID lancia un comando exec, per questo motivo mac osX non consente di lanciare exec. Con Mac se volete lanciare un comando bash da un Thread dovete usare:

    1 system 'ls'

Vedrete che funzionerà tutto correttamente. Su linux invece la gestione dei pThread consente di lanciare exec e questo è quello che accade:

shell3.png

Scrivi un commento