Autore Topic: Interagire con il terminale linux  (Letto 8713 volte)

Offline aleandro

  • Gambero
  • **
  • Post: 72
    • Mostra profilo
Interagire con il terminale linux
« il: 22 Dicembre 2013, 12:11:46 »
Salve, sto cercando di creare una semplice gui per il programma units (comando) di linux. Ho notato che manca una gui e pensavo di crearla con gambas.

 Il problema è il seguente. Una volta installato units col comando sudo apt-get install units questo è presente nel sistema operativo pronto per essere lanciato. Se viene lanciato da gambas con Shell si apre e si vede il risultato nella console di gambas. Fino qui tutto ok. Il comando units inizialmente chiede quale unità di misura bisogna convertire. Ho pensato di mettere un bel "shell units for write" per immettere l'input "prova" e "prova1" da due TextArea differenti. Ora mi sono già arenato. Units chiede l'unità da convertire e poi l'unità desiderata, poi converte spara il risultato e inizia da capo.
Non capisco come fargli digerire i due input necessari e visualizzare l'output in una terza Textarea

Codice: [Seleziona]
Public Sub Button1_Click()
 Dim prova As String
 Dim prova1 As String
 Shell "units" For Write
 prova = TextArea1.Text
 prova1 = TextArea2.Text
 Print prova
 Print prova1

Il programmino vorrei integrarlo in Azeotrope insieme ad altri calcoli chimico-fisici.
La ragione di usare la shell di linux è che units è l'unico convertitore che conosco in grado di fare le conversioni con multipli e sottomultipli del S.I.
Riscrivere il programma totalmente in gambas è un obiettivo a medio termine ma per ora mi accontenterei di fare andare la pappa pronta.

Grazie per eventuali dritte.
« Ultima modifica: 22 Dicembre 2013, 12:16:01 da aleandro »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #1 il: 22 Dicembre 2013, 13:51:25 »
Ho pensato di mettere un bel "shell units for write" per immettere l'input "prova" e "prova1" da due TextArea differenti.
Non capisco come fargli digerire i due input necessari e visualizzare l'output in una terza Textarea


Devi gestire il processo lanciato con Shell mediante una viariabile di tipo Process.
Esempio semplice:
Codice: gambas [Seleziona]

Private pr As Process


Public Sub Form_Open()

   pr = Shell "units" For Write

end


Public Sub Button1_Click()

  Write #pr, TextArea1.Text

End

Al riguardo, ad esempio, vedi qua:
https://www.gambas-it.org/wiki/index.php/Lettura_dati_da_un_Processo_e_scrittura_dati_in_un_Processo_mediante_Process

ed anche qua:
http://www.gambas-it.org/smf/index.php?topic=1908.msg21179#msg21179
in modo particolare l'applicativo di esempio fatto da fsurfing.


Riscrivere il programma totalmente in gambas è un obiettivo
...sarebbe molto più interessante !
« Ultima modifica: 01 Ottobre 2023, 23:03:46 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 vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #2 il: 22 Dicembre 2013, 14:27:21 »
Un'altra modalità, per scrivere nel terminale e lanciare ciò che si è scritto, è quella descritta nel caso analogo seguente:

http://www.gambas-it.org/wiki/index.php?title=Lanciare_un_programma_senza_Shell,_ma_da_una_finestra_di_un_Terminale
« 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 aleandro

  • Gambero
  • **
  • Post: 72
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #3 il: 22 Dicembre 2013, 14:52:11 »
Codice: [Seleziona]
pr As Process  
 
     
    Public Sub Form_Open() 
     
      pr = Shell "units" For Write As "pr"
     
    End 

     
    Public Sub Button1_Click() 
     
     Print #pr, TextArea1.Text 
     Print #pr, TextArea2.Text
     
 End

Allora funziona.

Problema successivo. I dati di risultato li vedo scritti nella console di gambas. Dovrei portarli in una  terza area  di testo per visualizzarli correttamente.  Come si legge da console gambas e si scrive in un'area di gambas?

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #4 il: 22 Dicembre 2013, 15:11:53 »
Allora funziona.

Molto bene !   :)



Problema successivo. I dati di risultato li vedo scritti nella console di gambas. Dovrei portarli in una  terza area  di testo per visualizzarli correttamente.  Come si legge da console gambas e si scrive in un'area di gambas?

Dai uno sguardo alle pagine presenti nel capitolo "Terminale - Console IDE Gambas" della nostra WIKI:

http://www.gambas-it.org/wiki/index.php?title=Guide_della_comunit%C3%A0#Terminale_-_Console_IDE_Gambas
« 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 aleandro

  • Gambero
  • **
  • Post: 72
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #5 il: 22 Dicembre 2013, 16:02:15 »
Codice: [Seleziona]
 pr As Process  
 
       
    Public Sub Form_Open() 
      Shell "gnome-terminal -e script"
      pr = Shell "units" For Write As "pr"
     
    End 
   
    Public Sub Button1_Click() 
     Desktop.OpenTerminal

    ' Attendiamo la creazione del file speciale "/dev/pts/1":
    Do
    Wait 0.01
    Loop Until Exist("/dev/pts/1")
 
 ' Leggiamo dal file "typescript", ed indirizziamo il contenuto al nuovo Terminale appena aperto:
     Shell "cat /percorso_del_file/typescript > /dev/pts/1"
 
     Print #pr, TextArea1.Text 
     Print #pr, TextArea2.Text
     
   End

Ho provato il metodo script ma non vedo nessun file typescript creato....La guida non mi sembra chiara.

Offline aleandro

  • Gambero
  • **
  • Post: 72
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #6 il: 22 Dicembre 2013, 16:55:09 »
Print scrive nella console e fin qui tutto ok. Ma come passo dalla console ad un box di testo nella mia interfaccia? Sembra a giudicare dai post che si trovano in giro per google che molti abbiano problemi.

Chiedo lumi

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #7 il: 22 Dicembre 2013, 17:18:39 »
Ho provato il metodo script ma non vedo nessun file typescript creato....La guida non mi sembra chiara.

La guida della nostra WIKI ci dice che dopo aver scritto nel terminale, si deve lanciare il comando exit (si può anche inviare Ctrl+d). La nota n. 1 a pie' pagina ci dice che il nome numerico del file speciale pts può essere anche diverso da 1 (come invece è lì riportato per mere esigenze esemplificative). Il file pts (relativo al terminale) che sarà creato, va verificato preventivamente in modo empirico lanciando il Terminale e controllando quale file si crea. In vero, tale verifica può essere compiuta a post non empiricamente, ma a livello di codice Gambas: verificando l'ID dell'ultima finestra aperta.
« 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 vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #8 il: 23 Dicembre 2013, 00:42:08 »
... come passo dalla console ad un box di testo nella mia interfaccia?

Una possibilità (...non molto automatica, purtroppo) è quella descritta nell'ultimo paragrafo ("Intercettare il testo scritto nella console dell'IDE di gambas") di questa pagina:
http://www.gambas-it.org/wiki/index.php?title=Rendere_la_console_dell%27IDE_funzionale_come_un_Terminale


Altro caso:
http://www.gambas-it.org/wiki/index.php?title=Intercettare_quanto_viene_scritto_manualmente_nella_console_o_in_un_Terminale#L.27applicativo_intercetta_i_dati_scritti_nella_propria_console_ed_inviati_alla_propria_console
« Ultima modifica: 27 Dicembre 2013, 10:46:19 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 aleandro

  • Gambero
  • **
  • Post: 72
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #9 il: 23 Dicembre 2013, 12:12:52 »
Ho provato tutti i modi. Purtroppo se inserisco comandi shell write non posso mettere poi lo stesso comando con read. Mi sembra strano che non ci sia una soluzione semplice per leggere quello che avviene in console di gambas tenendo conto che programmare gambas è davvero semplice e logico.

Ovviamente riscrivere il programmino per convertire le unità di misura sarebbe semplice ma comunque dispendioso in termini di tempo e poi -units- è talmente efficiente da sbalordire. Forse se inserisco la discussione nel forum di ubuntu qualcuno riuscirà a trovare una soluzione. Per ora mi limito a riprovare le varie soluzioni riportate magari cambiando un pò di variabili. Se volete provare il codice vi zippo una cartellina. La prima parte viaggia bene ed è sorprendente nella semplicità.

Se qualcuno ha già avuto esperienza con l'interazione con la shell di linux si faccia avanti. Mi piacerebbe sapere se ci sono nei programmi pubblici di gambas degli esempi di interazione con la shell un pò più complessi. 

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #10 il: 23 Dicembre 2013, 12:24:13 »
Purtroppo se inserisco comandi shell write non posso mettere poi lo stesso comando con read.

Codice: gambas [Seleziona]
pr = Shell "comando" For Read Write




Mi sembra strano che non ci sia una soluzione semplice per leggere quello che avviene in console di gambas 

...non è proprio una cosa semplice.


Ovviamente riscrivere il programmino per convertire le unità di misura sarebbe semplice...e poi -units- è talmente efficiente da sbalordire.
Se non erro, la libraria esterna su cui si basa units è "libudunits2-0".
Utilizzando le risorse della sua API, otterresti i medesimi risultati.  :-\
« 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 aleandro

  • Gambero
  • **
  • Post: 72
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #11 il: 23 Dicembre 2013, 12:58:47 »
Codice: [Seleziona]
pr As Process  

Private prova As Process
      
    Public Sub Form_Open()  
      
    pr = Shell "units" For Write As "pr"
    prova = Exec [System.Shell] For Read Write As "processo"
      
    End  
    

Public Sub processo_Read()

 Dim s As String
 
  Line Input #prova, s
  
  result.Text &= s & "\n"
 
End
 
      
  Public Sub Button1_Click()  
    
     Print #pr, TextArea1.Text  
     Print #pr, TextArea2.Text
    
  End

Con questo codice non mi apre nessuna shell. Per System.shell si intende /bin/sh?

Mentre con questo non succede nulla.

Codice: [Seleziona]
pr As Process  
Private por As Process
Private fl As File   

    Public Sub Form_Open()  
      
    pr = Shell "units" For Write As "pr"
    por = Exec [System.Shell] For Write
' Apriamo in lettura e sottoponiamo in osservazione lo standard Out:
   fl = Open "/dev/stdout" For Read Watch
End  
    
    
Public Sub Button1_Click()  
    
  Print #pr, TextArea1.Text  
  Print #pr, TextArea2.Text
    
End



Public Sub File_Read()

 Dim s As String
 Line Input #fl, s
 result.Text &= s
 Print "Osservato: "; s

End
« Ultima modifica: 23 Dicembre 2013, 13:15:36 da aleandro »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #12 il: 23 Dicembre 2013, 13:13:50 »
Con questo codice non mi apre nessuna shell. Per System.shell si intende /bin/sh?

Non fa aprire alcun Terminale.
Di default viene utilizzato /bin/sh.
« Ultima modifica: 23 Dicembre 2013, 13:19:47 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 aleandro

  • Gambero
  • **
  • Post: 72
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #13 il: 23 Dicembre 2013, 13:18:05 »
Citazione
Non fa aprire alcun Terminale.

Io ho capito questo. Il comando Exec in quel caso dovrebbe aprire un terminale esterno a quello di gambas per poter gestire dall'esterno i dati di risultato e poi riportarli dentro in gambas...

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Interagire con il terminale linux
« Risposta #14 il: 23 Dicembre 2013, 13:20:00 »
.....Inoltre, affinché la console dell'IDE di Gambas possa essere utilizzata come fosse un Terminale (e quindi lanciare comandi bash), la riga di comando deve essere molto essenziale:
Codice: gambas [Seleziona]
Exec [System.Shell]

tutt'al più
Codice: gambas [Seleziona]
pr = Exec [System.Shell]


insomma senza For..... As "...."
« Ultima modifica: 23 Dicembre 2013, 13:26:39 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. »