Gambas-it

Gambas3 => Programmazione => Topic aperto da: Gratisweb - 12 Dicembre 2021, 22:58:16

Titolo: Info shell
Inserito da: Gratisweb - 12 Dicembre 2021, 22:58:16
Ho creato un pulsante e dentro il pulsante ho scritto il comando
Shell "mate-terminal -- nome programma"

come faccio in modo che il terminale resti aperto e lo devo chiudere io senza che si chiude da solo ?
Titolo: Re:Info shell
Inserito da: vuott - 12 Dicembre 2021, 23:01:38
Shell "mate-terminal -- nome programma"
Scusami, con Shell tu lanci un Terminale, nel quale poi lanci un programma ?

Altra domanda per capire: ti succede che dopo l'esecuzione del programma, lanciato nel Terminale, questo si chiude automaticamente ?
Titolo: Re:Info shell
Inserito da: Gratisweb - 12 Dicembre 2021, 23:09:13
si lancio un programma che funziona da terminale ma succede che si chiude il terminale subito ed invece voglio chiuderlo solo io
Titolo: Re:Info shell
Inserito da: vuott - 12 Dicembre 2021, 23:12:31
Bisognerebbe fare qualche prova.
Quale programma fai lanciare in Terminale ?
Titolo: Re:Info shell
Inserito da: Gratisweb - 12 Dicembre 2021, 23:14:30
speedtest-cli
Titolo: Re:Info shell
Inserito da: vuott - 12 Dicembre 2021, 23:18:15
Se provi questa riga di comando:
 
Codice: [Seleziona]
Shell System.Find("mate-terminal") & " -x " & System.Find("speedtest-cli")
oppure:
 
Codice: [Seleziona]
Shell System.Find("mate-terminal") & " -e " & System.Find("speedtest-cli")
cosa succede ?
Titolo: Re:Info shell
Inserito da: Gratisweb - 12 Dicembre 2021, 23:20:18
Che si chiude il terminale ed invece non si deve chiudere
Titolo: Re:Info shell
Inserito da: vuott - 12 Dicembre 2021, 23:28:44
Ti accade anche se lanci altri programmi ?
Titolo: Re:Info shell
Inserito da: Gratisweb - 12 Dicembre 2021, 23:32:36
No, quando lancio i programmi che funzionano solo da terminale
Titolo: Re:Info shell
Inserito da: vuott - 12 Dicembre 2021, 23:42:16
Sì, certo.
Comunque sto notando che, quanto tu descrivi, accade anche con l'emulatore di Terminale "xterm".
Titolo: Re:Info shell
Inserito da: Gratisweb - 12 Dicembre 2021, 23:43:02
si, il terminale di mate desktop
Titolo: Re:Info shell
Inserito da: vuott - 12 Dicembre 2021, 23:55:09
Comunque mi accade solo con alcuni programmi.
Ad esempio:
 
Codice: [Seleziona]
Shell System.Find("xterm") & " -e wmctrl -l"

Invece, se lancio questo:
 
Codice: [Seleziona]
Shell System.Find("xterm") & " -e cvlc /percorso/di/un/file/audio"
oppure con (io non ho l'ambiente grafico Mate, ma Gnome):
 
Codice: [Seleziona]
Shell System.Find("gnome-terminal") & " -x cvlc /percorso/di/un/file/audio"
il terminale richiamato si apre e non si chiude istantaneamente.
Titolo: Re:Info shell
Inserito da: vuott - 13 Dicembre 2021, 00:45:02
Ad ogni modo, se tu vuoi lanciare il programma da Terminale semplicemente perché ne vuoi vedere i dati restituiti, puoi fare diversamente gestendo il processo del programma, lanciato con Shell, mediante la Classe "Process" e ponendolo in "osservazione" dopo averlo aperto in "Lettura" .
Titolo: Re:Info shell
Inserito da: Gratisweb - 13 Dicembre 2021, 07:51:29
Con gnome-terminal si chiude
Titolo: Re:Info shell
Inserito da: Gratisweb - 13 Dicembre 2021, 09:48:52
Ho scritto un codice ma non funziona perchè come ho detto sono principiante e sbaglio qualcosa
Dim a As String
Shell System.Find("gnome-terminal") & " -x " & System.Find("speedtest-cli") To a
Label1.Text = a

ma va in errore, ho sbagliato qualcosa
Titolo: Re:Info shell
Inserito da: vuott - 13 Dicembre 2021, 14:27:19
...con Shell il richiamo a un Terminale non è necessario.
 Fai semplicemente:
Codice: [Seleziona]
Dim a As String

Shell "speedtest-cli" To a

Label1.Text = a

L'uso dell'istruzione "To variabile", però, va bene se il programma lanciato ti restituisce un risultato tutto subito, in un colpo solo.
Se "speedtest-cli" ti dà vari risultati differiti nel tempo, allora dovrai porlo sotto osservazione aprendo il suo processo in Lettura:
Codice: [Seleziona]
Private pr As Process

Public Sub Form_Open()

' Lancia "speedtest-cli", ne apre il processo e lo pone sotto osservazione:
 pr = Shell "speedtest-cli" For Input As "Speed"

End

 ' Quando c'è qualcosa da leggere dal processo di "Speedtest-cli", allora viene sollevato questo Evento di lettura dei dati:
Public Sub Speed_Read()

 Dim s As String
 
 Line Input #pr, s

 Label1.Text = s

End


Al riguardo suggerisco questa pagina:
   https://www.gambas-it.org/wiki/index.php?title=Lettura_dati_da_un_Processo_e_scrittura_dati_in_un_Processo
Titolo: Re:Info shell
Inserito da: Gratisweb - 13 Dicembre 2021, 16:17:58
 Line Input #pr, s

Indicatore sconosciuto (pr)
Titolo: Re:Info shell
Inserito da: vuott - 13 Dicembre 2021, 16:24:59
Indicatore sconosciuto (pr)
Hai inserito all'inizio del codice questa riga ?

 
Codice: [Seleziona]
Private pr As Process
Titolo: Re:Info shell
Inserito da: Gratisweb - 13 Dicembre 2021, 16:27:06
Public Sub Form_Open()
' Lancia "speedtest-cli", ne apre il processo e lo pone sotto osservazione:
 pr = Shell "speedtest-cli" For Input As "Speed"
End
Public Sub Speed_Read()

 Private pr As Process
 Dim s As String
 
 Line Input #pr, s

 Label.Text1.Text = s

End

Indicatore sconosciuto (pr)
Titolo: Re:Info shell
Inserito da: vuott - 13 Dicembre 2021, 16:32:26
1) Non hai copiato e quindi inserito la prima riga della dichiarazione della variabile di tipo "Process" come Globale.
Riguarda bene il mio codice all'inizio.
Essa va inserita così:
Codice: [Seleziona]
Private pr As Process

Public Sub Form_Open()

 ...etc....

2) C'è un mio errore di scrittura qua:
 Label.Text1.Text = s

che ora ho corretto.
Ovviamente va scritto così:
Codice: [Seleziona]
Label1.Text = s
Titolo: Re:Info shell
Inserito da: Gratisweb - 13 Dicembre 2021, 16:32:49
Scusa, l' avevo scritto sbagliato.
Mi appare però sulla label solo il risultato del download
come faccio a far apparire il risultato del download e upload ?
Titolo: Re:Info shell
Inserito da: vuott - 13 Dicembre 2021, 16:35:44
Scusa, l' avevo scritto sbagliato.
Mi appare però sulla label solo il risultato del download
come faccio a far apparire il risultato del download e upload ?
Io purtroppo non posseggo il programma "speedtest-cli" e neppure ne conosco il funzionamento.
L'unica cosa che ho potuto dirti è che la gestione dei Processi dei programmi aperti con "Shell" (o con "Exec") è in buona sostanza come sopra descritto.
...forse devi inserire qualche opzione... forse. O forse devi attendere la sua azione dell'upload... Non so.   :-\
Titolo: Re:Info shell
Inserito da: Gratisweb - 13 Dicembre 2021, 16:38:20
Siccome lo devo inserrire in un bottone ma sbaglio qualcosa

Public Sub Button1_Click()
' Lancia "speedtest-cli", ne apre il processo e lo pone sotto osservazione:
 Dim s As String
 pr = Shell "speedtest-cli" For Input As "Speed"
  Line Input #pr, s
 Label1.Text = s

End
Titolo: Re:Info shell
Inserito da: Gratisweb - 13 Dicembre 2021, 16:40:08
Siccome lo devo inserrire in un bottone ma sbaglio qualcosa

Public Sub Button1_Click()
' Lancia "speedtest-cli", ne apre il processo e lo pone sotto osservazione:
 Dim s As String
 pr = Shell "speedtest-cli" For Input As "Speed"
  Line Input #pr, s
 Label1.Text = s

End

Basta installarlo, si trova su synaptic
sudo apt-get install speedtest-cli
Titolo: Re:Info shell
Inserito da: vuott - 13 Dicembre 2021, 16:50:55
Va be'... l'ho installato. Mannaggia !  :violent:

Ho fatto la prova con il mio codice sopra mostrato, facendo però scrivere tutto in console.
A me funziona completamente.
Ecco i risultati:

Testing download speed................................................................................
Download: 44.53 Mbit/s
Testing upload speed...
Upload: 5.74 Mbit/s


Devi attendere un po' per ottenere i risultati.
Fai la prova in console, per ora, come ho fatto io:
 
Codice: [Seleziona]
Print s
Titolo: Re:Info shell
Inserito da: Gratisweb - 13 Dicembre 2021, 17:01:23
sistemato, adesso voglio che sulla label vengono riportate tutte le voci

Tipo così
Retrieving speedtest.net configuration...
Testing from Telecom Italia (XX.XXX.XXX.XXX)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by Fly Network (Novi Velia) [304.38 km]: 70.526 ms
Testing download speed................................................................................
Download: X.XX Mbit/s
Testing upload speed...
.
Upload: X.XX Mbit/s
Titolo: Re:Info shell
Inserito da: vuott - 13 Dicembre 2021, 17:08:06
Eh... e quindi ? ....come faresti ?
Fai delle prove. Cerca di risolvere tu la questione (...'sto programma lo devi fare tu, o io ?  :violent: )
Se hai problemi, li vediamo insieme.  :)
Titolo: Re:Info shell
Inserito da: Gratisweb - 13 Dicembre 2021, 17:12:01
ok
scrivendo così Label1.Text = Label1.text + s
va in errore sarà sbaglio qualcosa. Una volta ma parlo di 25 anni fa circa programmavo in visual basic.
Titolo: Re:Info shell
Inserito da: Gratisweb - 13 Dicembre 2021, 17:16:28
Ci sto riuscendo.....
Grazie
Titolo: Re:Info shell
Inserito da: vuott - 13 Dicembre 2021, 17:18:29
scrivendo così Label1.Text = Label1.text + s
va in errore sarà sbaglio qualcosa.
Per aggiungere una stringa ad un'altra precedente devi usare l'operatore "&".
Nel tuo caso però devi anche aggiungere il ritorno a capo, altrimenti la Label ti scrive tutto su una riga.

Codice: [Seleziona]
Label1.Text &= s & "\n"
Ossia: alla Label va assegnato il suo testo posseduto con l'aggiunta di quello presente nella variabile "s", alla fine della stringa va altresì aggiunto il comando escape di nuova riga a capo.

Su come andare a capo in un oggetto di testo, suggerisco questa pagina:
   https://www.gambas-it.org/wiki/index.php?title=%22Andare_a_capo%22_in_un_oggetto_di_testo
Titolo: Re:Info shell
Inserito da: vuott - 13 Dicembre 2021, 17:36:57
Se vuoi adattare tutto alla dimensione delle stringhe lette:

Codice: [Seleziona]
Private c As Short


' Quando c'è qualcosa da leggere dal processo di "Speedtest-cli", allora viene sollevato questo Evento di lettura dei dati:
Public Sub Speed_Read()

 Dim s As String
 
 Line Input #pr, s

' Se la larghezza orizzontale della "corrente" (or ora letta) stringa di caratteri è maggiore del valore presente nella variabile "c", allora la variabile "c" assumerà il valore della larghezza della "corrente" stringa:
 If Label1.Font.TextWidth(s & Space(5)) > c Then c = Label1.Font.TextWidth(s & Space(5))
' Il "Form" principale assume la larghezza pari al valore contenuto dalla variabile "c":
 Me.W = c
' Così anche la "Label":
 Label1.W = c
 
' Nella "Label" vengono scritti il testo precedentemente contenuto + la nuova riga or ora letta + il carattere di nuova riga a capo:
 Label1.Text &= s & "\n"

End

Amen !
Titolo: Re:Info shell
Inserito da: vuott - 13 Dicembre 2021, 20:16:35
...oppure, anziché usare questa riga con un booleano esplicito:
Codice: [Seleziona]
If Label1.Font.TextWidth(s & Space(5)) > c Then c = Label1.Font.TextWidth(s & Space(5))

puoi usare la funzione nativa "Max()":
 
Codice: [Seleziona]
c = Max(Label1.Font.TextWidth(s & Space(5)), c)
Titolo: Info contenuto shell
Inserito da: Gratisweb - 05 Marzo 2023, 17:02:46
Ho scritto questo semplice codice che dovrebbe restituire le info della cpu ma non restituisce nulla, sbaglio qualcosa ?

  Dim cpu As String
  Shell "cat / proc / cpuinfo | grep 'model name' | uniq | awk -F ':' '{print $2}'" To cpu
  label.Text = cpu
Titolo: Re:Info contenuto shell
Inserito da: vuott - 05 Marzo 2023, 18:08:15
Non ho avuto modo di provarlo, ma almeno con riferimento a questa parte - come da te riportata - del percorso specificato:
Codice: [Seleziona]
/ proc / cpuinfo
vi sono degli spazi che ovviamente non dovrebbero esserci.
Ossia correttamente:
Codice: [Seleziona]
/proc/cpuinfo

In ogni modo, poiché io sono estrememente contrario all'uso di Shell (se non in casi particolarissimi e delicati), colgo l'occasione di segnalare le pagine della nostra wiki afferenti alla cpu:
CPU e Scheda Madre (https://www.gambas-it.org/wiki/index.php/Guide_della_comunit%C3%A0#CPU_e_Scheda_Madre)
Titolo: Re:Info shell
Inserito da: vuott - 06 Marzo 2023, 15:35:11
Ad ogni modo mi pare che, osservando la linea di comando con Shell da te presentata, sei interessato a conoscere il contenuto del parametro "model name" della CPU presente nel file "/proc/cpuinfo".
Ebbene, poiché questo file di sistema può essere letto come fosse un file di testo, per conoscerne il contenuto, è sufficiente utilizzare le native funzioni di Gambas per la gestione delle stringhe di testo.
Pertanto, se ad esempio abbiamo un hardware costituito da una sola CPU (oppure, se multicore, fare riferimento alla prima CPU considerata dal"/proc/cpuinfo"), possiamo conoscere quanto riportato al parametro, da te ricercato ("model name "), con questo semplice codice usando la funzione Scan() (https://gambaswiki.org/wiki/lang/scan?l=it) nativa di Gambas:
Codice: [Seleziona]
Public Sub Main()

  Dim s As String
 
  s = File.Load("/proc/cpuinfo")
 
  s = Scan(s, "*model name*:*stepping*")[2]
 
  Print Trim(s)

End
...vi sembra così complicato da doversi appellare al comando bash "cat"  e alla funzione Shell ?  :-\
Titolo: Re:Info shell
Inserito da: cogier - 06 Marzo 2023, 16:51:01
In alternativa: -

Codice: [Seleziona]
 Dim sCPU As String

  Shell "lscpu | grep 'Model name:'" To sCPU
  sCPU = Trim(Replace(sCPU, "Model name:", ""))

  Print sCPU