Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[DEV] Richiamare delle funzioni di uno script dall'esterno
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Forum italiano (Italian)
View previous topic :: View next topic  
Author Message
silian87
Advocate
Advocate


Joined: 06 Oct 2003
Posts: 2318
Location: Treviso, Italy

PostPosted: Fri Jul 09, 2004 10:11 pm    Post subject: [DEV] Richiamare delle funzioni di uno script dall'esterno Reply with quote

Avrei bisigno per un programma di backup che sto sviluppando si fare un file.sh che contenesse tutte le funzioni, ed uno con il main. Volevo richiamare le funzioni bash in stile runscript, come facciamo per avviare un demone e cioe':

Code:
/etc/init.d/ssh start
/etc/init.d/ssh e' il file sh e start e' una funzione. Purtroppo non funziona con script che usano bash (#!/bin/bash). Infatti i demoni usano runsript (/sbin/runscript). Ho aperto l'sh di runscript, ma credo che l'interprete che richiama le funzioni sia nel file sorgente C di /sbin/runscript. Volevo sapere se qualcuno sa come invocare, quindi, una funzione di uno script all'esterno di esso, magari passando la funzione come argomnto "$1" o "$2". Grazie.
_________________
Musica che ascolto: http://www.last.fm/user/silian87/

Silian87 FAQs: http://marentax.homelinux.org/~silian87/silian87-faq.txt

GTalk: silian87@gmail.com
Back to top
View user's profile Send private message
FonderiaDigitale
Veteran
Veteran


Joined: 06 Nov 2003
Posts: 1710
Location: Rome, Italy

PostPosted: Fri Jul 09, 2004 10:42 pm    Post subject: Reply with quote

e' veramente una stupidata.
ti faccio un veloce excursus di cosa potrebbe servirsi:

in bash, le variabili passate da riga di comando:
Code:
$0 = percorso completo del file eseguito es. /usr/bin/ciccio.sh
`basename $0`= lo script di per se stesso, es. ciccio.sh
$1 $2 $3 ... $n = i parametri passati allo script in ordine sequenziale
$@ = l'insieme di tutti i parametri passati


ricorda che in bash, salvo espressamente indicato, lo spazio e' un separatore di variabili, o array.

per fare un parsing di parametri da riga di comando, usa qualcosa di questo tipo:
Code:

#!/bin/sh
case $@ in
  -p|--pippo)
          echo "hai selezionato pippo"
          shift
  ;;
  -m|--mamma)
          shift
          opzione_di_mamma=$1
          echo "hai selezionato mamma con opzione $opzione_di_mamma"
          shift
  ;;
  -b|--babbo)
          echo "hai selezionato babbo"
          shift
   ;;
  *)  echo "tutto il resto"
   ;;
esac

questo e' quello che faccio io di solito, ovvero includo sia la forma breve che quella lunga della opzione.
non ti conviene usare un ciclo di while o for, poiche' alcuni parametri richiedono una variabile a volte (Es. --debug 4)
shift va avanti col parsing di una posizione (leggi:passa avanti al prossimo)
quindi potresti fare una cosa tipo:
Code:
#!/bin/sh

func_start () {
echo "parto"
}

func_stop ()
echo "mi stoppo"
exit 0
}

func_help () {
  echo "Abbello, devi darmi un'azione da fare"
  exit 1
}

case $1 in
    start) func_start
    ;;
    stop) func_stop
    ;;
    *) func_help
    ;;
esac

_________________
Come disse un amico, i sistemisti sono un po' come gli artigiani per l'informatica :)
Back to top
View user's profile Send private message
silian87
Advocate
Advocate


Joined: 06 Oct 2003
Posts: 2318
Location: Treviso, Italy

PostPosted: Sat Jul 10, 2004 7:44 am    Post subject: Reply with quote

mm grazie.. adesso ho capito che non era complicato...
pero' io mettero' molte funzioni... non si puo' fare che il parametro che io li do fa partire direttamente la funzione con lo stesso nome? Credo che in fondo il runscript faccia qualcosa del genere.

tipo io li do:
Code:
nomescript.sh funzione


E lui ha del codice che fa immeditamente
Code:
exec funzione


In questo modo e' vero che se sbaglio parametro mi da un errorre, pero' c'e' molto meno codice, e poi io questo script non lo devo usare come interfaccia utente, sara' un altro script ad usarlo.

In alternativa non e' possibile fare uno script esterno che faccia questo compito di rischiamare le funzioni di un'akltro?


P.S.: Ieri ho imparato il comando source!!! Prima stavo gia' pensando di usare awk o grep per prendermi i parametri di configurazione!
_________________
Musica che ascolto: http://www.last.fm/user/silian87/

Silian87 FAQs: http://marentax.homelinux.org/~silian87/silian87-faq.txt

GTalk: silian87@gmail.com
Back to top
View user's profile Send private message
FonderiaDigitale
Veteran
Veteran


Joined: 06 Nov 2003
Posts: 1710
Location: Rome, Italy

PostPosted: Sat Jul 10, 2004 11:37 am    Post subject: Reply with quote

basta che dichiari le funzioni con lo stesso nome dei comandi che vuoi dare, e poi
Code:

#!/bin/sh
start () {
 ....
}

# esegue la funzione
$1

_________________
Come disse un amico, i sistemisti sono un po' come gli artigiani per l'informatica :)
Back to top
View user's profile Send private message
Cagnulein
l33t
l33t


Joined: 18 Sep 2003
Posts: 861
Location: Modena, Italy

PostPosted: Sat Jul 10, 2004 5:45 pm    Post subject: Reply with quote

Code:
  -m|--mamma)
          shift
          opzione_di_mamma=$1
          echo "hai selezionato mamma con opzione $opzione_di_mamma"
          shift


possibile che questo case non mi funzioni? non viene valorizzato il $1...ho usato esattamente il tuo script
Back to top
View user's profile Send private message
FonderiaDigitale
Veteran
Veteran


Joined: 06 Nov 2003
Posts: 1710
Location: Rome, Italy

PostPosted: Sat Jul 10, 2004 7:47 pm    Post subject: Reply with quote

fammi vedere lo script e come lo lanci :)
_________________
Come disse un amico, i sistemisti sono un po' come gli artigiani per l'informatica :)
Back to top
View user's profile Send private message
Cagnulein
l33t
l33t


Joined: 18 Sep 2003
Posts: 861
Location: Modena, Italy

PostPosted: Sun Jul 11, 2004 9:58 am    Post subject: Reply with quote

ecco qui il risultato:
Code:

bash-2.05b$ ./prova --mamma 40
tutto il resto
bash-2.05b$ ./prova -m 40
tutto il resto
bash-2.05b$ ./prova -m
hai selezionato mamma con opzione
bash-2.05b$ ./prova --mamma
hai selezionato mamma con opzione


lo script è il tuo, ho fatto copia incolla e basta, cmq eccolo:
Code:
#!/bin/sh
case $@ in
  -p|--pippo)
          echo "hai selezionato pippo"
          shift
  ;;
  -m|--mamma)
          shift
          opzione_di_mamma=$1
          echo "hai selezionato mamma con opzione $opzione_di_mamma"
          shift
  ;;
  -b|--babbo)
          echo "hai selezionato babbo"
          shift
   ;;
  *)  echo "tutto il resto"
   ;;
esac
Back to top
View user's profile Send private message
FonderiaDigitale
Veteran
Veteran


Joined: 06 Nov 2003
Posts: 1710
Location: Rome, Italy

PostPosted: Sun Jul 11, 2004 12:12 pm    Post subject: Reply with quote

mea culpa. ho scritto troppo in velocita' senza testare il codice :)
Code:

#!/bin/sh
while [ -n "$1" ]
do
 case "$1" in
  -p|--pippo)
          echo "hai selezionato pippo"
  ;;
  -m|--mamma)
          shift
          [ -z "$1" ] && echo "introduci un parametro";exit
          opzione_di_mamma=$1
          echo "hai selezionato mamma con opzione $opzione_di_mamma"
  ;;
  -b|--babbo)
          echo "hai selezionato babbo"
   ;;
  *)  echo "tutto il resto"
   ;;
 esac
 shift
done

_________________
Come disse un amico, i sistemisti sono un po' come gli artigiani per l'informatica :)
Back to top
View user's profile Send private message
silian87
Advocate
Advocate


Joined: 06 Oct 2003
Posts: 2318
Location: Treviso, Italy

PostPosted: Mon Jul 12, 2004 11:35 am    Post subject: Reply with quote

ahh... basta mettere $1 e lui la fa partire... grazie :-)
_________________
Musica che ascolto: http://www.last.fm/user/silian87/

Silian87 FAQs: http://marentax.homelinux.org/~silian87/silian87-faq.txt

GTalk: silian87@gmail.com
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Forum italiano (Italian) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum