Autore Topic: [RISOLTO] eseguire uno script per shell  (Letto 2271 volte)

Offline Gaspare

  • Gambero
  • **
  • Post: 68
    • Mostra profilo
[RISOLTO] eseguire uno script per shell
« il: 29 Marzo 2010, 13:54:46 »
volevo eseguire un semplice script da una comoda interfaccia grafica... tale script dovrebbe eseguire la conversione dei file presenti in una directory (in formato .csv) in un'altro formato (compatibile per i navigatori tomtom .ov2) sfruttando il programma gpsbabel (richiesto per il funzionamento).
se eseguo lo script dopo averlo reso eseguibile esso funziona perfettamente ma se provo ad avviarlo da gambas mi dà il seguente messaggio: "ls: impossibile accedere a *.csv: Nessun file o directory"


le righe di codice che sto provando ad usare sono le seguenti:
Codice: [Seleziona]
PUBLIC SUB Button1_Click()
IF NOT Exist(DirView1.Current & "/csv2ov2") THEN
COPY user.home & "/.poiconvert/csv2ov2" TO DirView1.Current & "/csv2ov2"
'copio il file nella cartella di destinazione come richiesto dallo script
WAIT
ENDIF

SHELL "cd " & DirView1.Current 'sposto la shell nella cartella richiesta dallo script
SHELL "chmod +x " & DirView1.Current & "/csv2ov2" 'rendo eseguibile lo script
'SHELL "dir " & DirView1.Current 'prova per vedere se la shell punta a quella directory
SHELL DirView1.Current & "/csv2ov2"  ' eseguo lo script
'WAIT


 FileView1.Refresh 'aggiorno le liste dei file
 FileView2.Refresh
 
 'codice dove elimino il file creato per la conversione
 
 
 
END


e questo è il contenuto dello script incriminato:
Codice: [Seleziona]
#!/bin/bash
## csv2ov2
## traduzione files punti di interesse da formato csv a formato ov2 per tomtom
## i files da tradurre devono essere nella cartella di questo script
## i files ov2 saranno creati nella medesima cartella
## bop
echo > temp1
echo >> temp1
echo >> temp1
echo >> temp1           # creo un file con 4 righe vuote

for file in `ls *.csv ` ; do   # per ogni elemento della directory corrente ...

   a=${#file}      # lunghezza nome file
   let 'b = a - 4'      # calcola lunghezza nome file senza estensione
   noext=${file:0:b}   # estrae nome file senza estensione

   echo sto processando $noext

   cat temp1 $file > temp2   # aggiunge le 4 righe in testa al file (necessario a gpsbabel)
   gpsbabel -i tomtom_asc -f temp2 -o tomtom -F $noext.ov2   # trasforma in formato per tomtom

done

rm -f temp1 temp2 # elimina files temporanei
## eop


dove sbaglio????
grazie di cuore a tutti...
« Ultima modifica: 29 Marzo 2010, 15:48:44 da Gaspare »

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: eseguire uno script per shell
« Risposta #1 il: 29 Marzo 2010, 13:56:23 »
devi inglobare i 4 comandi shell in un unico comando concatenato

Offline Gaspare

  • Gambero
  • **
  • Post: 68
    • Mostra profilo
Re: eseguire uno script per shell
« Risposta #2 il: 29 Marzo 2010, 14:02:34 »
e come si concatenano più comandi SHELL???
perchè a questo punto non servirebbe neanche il file script e si potrebbero personalizzare i percorsi a piacimento... :)

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: eseguire uno script per shell
« Risposta #3 il: 29 Marzo 2010, 15:07:30 »
e come si concatenano più comandi SHELL???

con dei punti e virgola che separano le diverse istruzioni

SHELL "comando1; comando2; comando 458"

Offline Gaspare

  • Gambero
  • **
  • Post: 68
    • Mostra profilo
Re: eseguire uno script per shell
« Risposta #4 il: 29 Marzo 2010, 15:27:20 »
dopo vari tentativi ho scoperto che il problema risiede nei percorsi passati  (sicuramente dovuto dalla scarsa conoscenza di linux da parte mia)... se eseguo tutto nella home utente infatti tutto funziona perfettamente:

Codice: [Seleziona]
PUBLIC SUB Button1_Click()
IF NOT Exist(user.Home & "/csv2ov2") THEN
COPY user.home & "/.poiconvert/csv2ov2" TO User.Home & "/csv2ov2"
'copio il file script nella cartella home
WAIT
ENDIF
COPY DirView1.Current & "/" & FileView1.Current TO user.Home & "/" & FileView1.Current 'copio anche il file interessato nella home come richiesto dallo script
WAIT
SHELL "chmod +x csv2ov2" 'rendo lo script eseguibile
WAIT
SHELL "./csv2ov2" 'lancio lo script
WAIT
SHELL "rm -f csv2ov2 " & FileView1.Current 'elimino i file usati per la conversione
WAIT

 FileView2.Reload
 
 Message.Info("Conversione Effettuata")
 
END

Offline Gaspare

  • Gambero
  • **
  • Post: 68
    • Mostra profilo
Re: eseguire uno script per shell
« Risposta #5 il: 29 Marzo 2010, 15:47:59 »
proverò a concatenare più comandi adesso... magari anche a disassemblare lo script per gestirlo meglio da gambas (permettendo di scegliere i percorsi desiderati e la conversione dei soli file selezionati)... intanto posso mettere risolto nel titolo.
grazie a tutti davvero.

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: [RISOLTO] eseguire uno script per shell
« Risposta #6 il: 29 Marzo 2010, 16:09:12 »
Il problema non risiede nl modo in cui tu gestisci gli indirizzi ma è solo che forse non sai come gambnas gli gestisce...

Quando esegui un istruzione del terminale in gambas esso lo esegue sempre nella Home dell'utente ad ogni chiamata del comando SHELL. Questo vuol dire che se vuoi eseguire ad esempio il comando comando1 nell'indirizzo path1 allora dovresti fare:

SHELL "cd path1; comando1"

ovvero, con cd ti spsoti nel path1 ed esegui il comando1.

Se però vuoi eseguire nello stesso path anche un altro comando (ad esempio comando2) allora non ti basterà fare:

SHELL "cd path1; comando1"
SHELL "comando2"

poichè è vero che il primo comando lo esegue in path1 ma non appena richiami il secondo SHELL gambas si ripiazza nella tua home.

Spero di essere stato chiaro...se hai dubbi mettiti davanti allo specchio a mezzanotte e chiama il mio nick tre volte così io appaio!

Offline Gaspare

  • Gambero
  • **
  • Post: 68
    • Mostra profilo
Re: [RISOLTO] eseguire uno script per shell
« Risposta #7 il: 10 Aprile 2010, 01:21:59 »
più chiaro di così non si poteva...
 :D
grazie mille

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: [RISOLTO] eseguire uno script per shell
« Risposta #8 il: 10 Aprile 2010, 01:47:07 »
più chiaro di così non si poteva...
 :D
grazie mille

Figurati.... ;)

Offline Gaspare

  • Gambero
  • **
  • Post: 68
    • Mostra profilo
Re: [RISOLTO] eseguire uno script per shell
« Risposta #9 il: 10 Giugno 2010, 19:31:36 »
ho avuto difficoltà a far eseguire i comandi da shell "a tempo" che ho risolto concatenando i comandi con "&&" anzichè ";" in modo da attendere la fine di un comando prima di passare al successivo.
vi posto il prototipo funzionante del convertitore di file per navigatori tom tom dal formato .csv (scaricabile da diversi siti) a .ov2 (richiesto dal tomtom)
è necessaria l'installazione di gpsbabel nel sistema per un corretto funzionamento del programma.


p.s. sostituito l'allegato con uno più funzionale, adesso posso scegliere dove salvare il mio file  ;)
« Ultima modifica: 13 Giugno 2010, 16:25:21 da Gaspare »

Offline El Berto

  • Grande Gambero
  • ***
  • Post: 150
    • Mostra profilo
Re: [RISOLTO] eseguire uno script per shell
« Risposta #10 il: 02 Dicembre 2011, 18:13:25 »
Non so se sono nella discussione giusta, ma volevo eseguire un mount in automatico all'apertura:

se eseguo lo script "umount -t smbs /mnt/pippo" da console, allora funziona.
Se creo uno script .sh e lo eseguo "nel terminale", funziona.
Se lo eseguo in Gambas con "EXECUTE( "umount -t smbs /mnt/pippo"), allora non funziona.
Dov'è che sbaglio?
Grazie.

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: [RISOLTO] eseguire uno script per shell
« Risposta #11 il: 02 Dicembre 2011, 19:30:19 »
per lanciare un comando shell usi i comandi:

shell

oppure exec


non execute :)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.320
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: [RISOLTO] eseguire uno script per shell
« Risposta #12 il: 03 Dicembre 2011, 20:19:00 »

oppure exec


non execute :)

...solo aggiungo semplicemente che Exec vuole le parentesi quadre:
Codice: [Seleziona]
Exec ["umount -t smbs /mnt/pippo"]
« Ultima modifica: 03 Dicembre 2011, 20:29:02 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline El Berto

  • Grande Gambero
  • ***
  • Post: 150
    • Mostra profilo
Re: [RISOLTO] eseguire uno script per shell
« Risposta #13 il: 09 Dicembre 2011, 08:45:51 »
Chiedo scusa, ho sbagliato a scrivere, in realtà stavo usando EXEC con le parentesi quadre.
Ho provato anche con SHELL, ma niente.
Mi viene un dubbio: da riga di comando poi mi viene chiesta la password di amministratore, non è che non funziona perchè non sto inserendo la password?

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: [RISOLTO] eseguire uno script per shell
« Risposta #14 il: 09 Dicembre 2011, 10:30:16 »
si il problema è quello :)

lancia il comando con
Codice: [Seleziona]
shell "gksudo umount -t smbs /mnt/pippo"

naturalmente funziona correttamente solo se usi ubuntu  :(