Autore Topic: intercettare output console  (Letto 2235 volte)

Offline neo571

  • Gamberetto
  • *
  • Post: 11
    • Mostra profilo
    • http://fddf
intercettare output console
« il: 08 Settembre 2008, 11:06:56 »
Sto realizzando un piccolo programma che lancia con EXEC() un eseguibile a linea di comando, come posso intercettare gli eventuali errori che il programma da in console ?

Offline giulio

  • Maestro Gambero
  • ****
  • Post: 280
    • Mostra profilo
Re: intercettare output console
« Risposta #1 il: 08 Settembre 2008, 20:30:33 »
Con EXEC non so, uso sempre SHELL. Si fa così:

Codice: [Seleziona]

DIM sErroriConsole AS String
   
SHELL "ls " & User.home &/ "*.couscous " & " 2>&1" TO sErroriConsole
PRINT sErroriConsole

 

Spiegazione dell'esempio:

eseguo il comando ls per cercare i file con estensione "couscous" nella home dell'utente. ls non li trova e dà un errore sullo standard error.
Dobbiamo redirigere lo standard error sullo standard output e lo facciamo con "2>&1"

Altro modo è redirigere gli errori su un file temporaneo:

Codice: [Seleziona]

DIM sErroriConsole AS String
 
sErroriConsole = Temp$
SHELL "ls " & User.home &/ "*.couscous " & "2> " & sErroriConsole WAIT  
PRINT File.Load(sErroriConsole)



dipende dalle tue esigenze.

Ciao.

Offline neo571

  • Gamberetto
  • *
  • Post: 11
    • Mostra profilo
    • http://fddf
Re: intercettare output console
« Risposta #2 il: 10 Settembre 2008, 11:56:32 »
Non va bne, tiu spiego, allora io praticamente da prog lancio VNCViewer con parametro indirizzo IP(EXEC ["vncviewer", CStr(indirizzo.text)]), se l'ip non ha un server VNC attivo oppure non è raggiungibile il programma risponde :

vvncviewer: ConnectToTcpAddr: connect: No route to host
Unable to connect to VNC server


nella console di debug, come posso intercettare questo output per visualizzarlo in message.box?

Offline giulio

  • Maestro Gambero
  • ****
  • Post: 280
    • Mostra profilo
Re: intercettare output console
« Risposta #3 il: 10 Settembre 2008, 21:02:26 »
Sicuramente non ho capito. Faccio un ultimo tentativo.

Codice: [Seleziona]


PUBLIC SUB Form_Open()
 
  DIM sErroriConsole AS String
   
  SHELL "ls " & User.home &/ "*.couscous " & " 2>&1" TO sErroriConsole

  IF Process.LastValue = 2 THEN
    Message.Error(sErroriConsole, "Chiudi")  
    ME.Close
  ENDIF
 
END



Eseguo ls. ls esce con un errore. "Process.last = 2" verifica che ls sia
uscito con un errore. A quel punto il messaggio d'errore viene visualizzato in un message box. Se non ho capito, deve intervenire qualcun altro. Ciao.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: intercettare output console
« Risposta #4 il: 12 Settembre 2008, 14:52:32 »
Ogni programma in Linux, ritorna un codice di errore, che può essere catturato da sistema. Se non si verificano errori, il codice restituito è zero; per gli altri errori è necessario leggere la documentazione di VNCViewer. Questo codice viene SEMPRE restituito al sistema operativo, anche se sono stati visualizzati messaggi di warning o di errore.

Come ti ha suggerito giulio, il controllo dopo l'esecuzione è necessario per sapere se il comando è andato a buon fine; in caso contrario, dato che tutto l'output è stato accodato alla console, puoi catturalo tramite la variabile, e visualizzarlo in una msgbox. Se l'accodamento è stato fatto su un file, puoi comunque testare l'esito del comando, e in caso negativo aprire il file, leggerlo e presentarlo sempre in una msgbox.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: intercettare output console
« Risposta #5 il: 28 Marzo 2012, 16:52:52 »
Per utilità dei meno esperti - come me - riporto quanto appresso:

«
I dati introdotti in input con la tastiera vengono inseriti all'interno di un canale costituito da una sequenza continua di byte. Allo stesso modo i dati prodotti a video vengoni inseriti all'interno di un altro canale. Tali canali vengono definiti standard input e standard output. Pertanto la tastiera e' il canale standard input ed il video e' il canale standard output. Qualsiasi comando quindi, accetta in input dei valori che legge dallo standard input (la tastiera) e produce dei risultati scrivendoli nello standard output (il video). Ma un comando puo' produrre anche dei messaggi di errore se per esempio vengono introdotti dei valori in input non validi. I messaggi di errore dei comandi vengono scritti in un terzo canale, lo standard error.

Ogni canale standard e' identificabile da un numero: 0 per il canale standard input, 1 per il canale standard output e 2 per il canale standard error. Digitare il comando cat peppo > errori non produrrebbe il risultato voluto in quanto l'operatore > redirige lo standard output all'interno del file errori ma non lo standard error. Poiche' il file peppo non esiste il comando cat non scrive nulla nello standard output ma scrive un messaggio di errore nello standard error. Per specificare quale canale redirigere nel file errori si puo' usare il numero che lo identifica. Nel nostro esempio desideriamo redirigere lo standard error (2) e non lo standard output (1) all'interno del file errori. Pertanto possiamo scrivere:

cat peppo 2> errori

Il numero 2 a sinistra dell'operatore > specifica che il canale che intendiamo redirigere non e' lo standard output ma bensi' lo standard error. Il comando cat pippo > pluto scrive il contenuto di pippo all'interno di pluto. Questo perche' per default l'operatore > redirige lo standard output. In pratica e' la stessa cosa che scrivere cat pippo 1> pluto, in quanto in tal caso 1 se non specificato e' sottinteso. Diverso e' il comando 'cat pippo 1> dati 2> errori'. Qui si vuole infatti specificare che occorre inviare il contenuto di pippo all'interno del file dati ed eventuali errori all'interno del file errori. Tanto per complicare un po' di piu' le idee, illustriamo come sia possibile redirigere un canale standard all'interno di un altro canale standard. Fino ad ora abbiamo infatti rediretto un canale standard verso un file o viceversa, un file verso un canale standard. Per far riferimento ad un canale standard occorre usare l'operatore &. Infatto &0 fa riferimento al canale standard input, &1 fa riferimento al canale standard output e &2 fa riferimento al canale standard error. Quindi la stringa '2>&1' significa: redirezione del canale standard error (2) nel canale standard output (&1). Vediamo ad esempio il comando:

cat non_esiste 1> dati 2>&1

tale comando visualizza il contenuto del file non_esiste inviandolo non a video ma all'interno del file dati ed inoltre invia eventuali errori all'interno dello stesso file. In questo caso poiche' il file non_esiste come dice il nome non esiste ;o) verra' prodotto un messaggio di errore. Analizziamo il comando: cat legge dallo standard input il nome del file da visualizzare ma poiche' non lo trova produce un errore; inoltre il comando cat sa che il contenuto di tale file dovrebbe essere inviato all'interno del file dati e non a video ('1>' infatti redirige lo standard output nel file dati); infine cat sa che lo standard error deve essere rediretto nello standard output ('2>&1' infatti redirige lo standard error nello standard output). Il risultato e' che il messaggio di errore andrebbe scritto nello standard error ma, poiche' tale canale e' stato rediretto, viene scritto nello standard output. Poiche a sua volta lo standard output e' stato rediretto nel file dati, il messaggio di errore verra' scritto nel file dati. Seguendo lo stesso percorso logico, la stringa '1>&2' redirige lo standard output verso lo standard error. Riassumendo, '2>&1' invia lo standard error verso lo standard output e 1>&2 produce il risultato contrario.
»




Fonte:

http://www.wowarea.com/italiano/linux/shell.htm
« 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 md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: intercettare output console
« Risposta #6 il: 29 Marzo 2012, 10:20:37 »
Bravissimo!!! E' perfetto.  :ok:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: intercettare output console
« Risposta #7 il: 14 Giugno 2012, 21:14:16 »
Sicuramente non ho capito. Faccio un ultimo tentativo.

Per l'intercettazione della console in quanto tale, si può aggiungere anche la gestione con Process:
Codice: gambas [Seleziona]

Private hp As Process

Public Sub Form_Open()

  hp = Shell "ls " & User.home &/ "*.couscous" For Input As "alibaba"

End
 

Public Sub alibaba_Read()
  Dim s As String

  Line Input #hp, s
    Message.Error(s, "Chiudi")
    hp.Close
    Me.Close
  
End




Per l'argomento più in generale vedere nella WIKI, come per esempio anche qua:
http://www.gambas-it.org/wiki/index.php?title=Intercettare_dati_inviati_al_programma_dal_sistema_o_da_altri_programmi_utilizzati
« Ultima modifica: 02 Settembre 2014, 17:02:15 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. »