EXEC
[
Process = ]
EXEC Command [
WAIT ] [
FOR { {
READ |
INPUT } | {
WRITE |
OUTPUT } } ] [
AS Name ]
EXEC Command TO Variable
Esegue un comando eseguendo un processo figlio.
Viene creato un oggetto interno
Process per gestire il comando.
Sintassi standard
Il comando
Command passato a EXEC deve essere specificato come una lista di costanti stringa delimitate da virgole o come una matrice. Il primo elemento nella lista / matrice è il nome del comando e gli altri elementi sono i parametri dei comandi (se presenti).
-
Se viene specificato
WAIT
, l'interprete attende il completamento del comando, altrimenti il comando viene eseguito in background e il programma continuerà l'esecuzione.
Non dimenticare la parola chiave WAIT se vuoi concatenare i comandi, altrimenti il secondo comando inizierà prima della fine del primo!
-
Se viene specificato
FOR
, il comando input-output viene reindirizzato in modo che il programma intercetti:
-
Se è specificato
WRITE
, i dati possono essere inviati allo standard input del comando utilizzando l'oggetto Process con le istruzioni di output comuni: PRINT, WRITE, ... Si noti che è richiesto un riferimento all'oggetto Process.
-
Se viene specificato
READ
, gli eventi verranno generati ogni volta che il comando invia i dati al flusso (stream) di output standard: l'evento Read viene generato quando i dati vengono inviati al flusso di output standard e l'evento Error viene generato quando i dati vengono inviati al flusso di errori standard. Utilizzare l'oggetto process con Funzioni di Stream e Input/Output per leggere l'output standard del processo.
-
Se utilizzi le parole chiave
INPUT
e OUTPUT
invece di READ
e WRITE
, il processo viene eseguito all'interno di un terminale virtuale. Il processo penserà di correre all'interno di un vero terminale.
-
Name
è il nome dell'evento utilizzato dall'oggetto Process. Per impostazione predefinita, è "Process"
.
In Gambas 3 non esiste più un nome evento predefinito.
In altre parole, è necessario aggiungere
AS "Process"
per ottenere lo stesso comportamento di Gambas 2.
Puoi ottenere un riferimento all'oggetto interno
Process creato usando un'assegnazione.
Ricerca del programma
Il comando può essere specificato come percorso assoluto o come nome di programma.
Se il comando è specificato come nome del programma, allora quel programma viene cercato attraverso la variabile d'ambiente
PATH
.
Questa funzione è utile, ma rallenta il tempo di avvio.
Dal 3.6
È possibile utilizzare il metodo
System.Find
per cercare un programma attraverso la variabile di ambiente
PATH
.
Quindi è possibile memorizzare il percorso assoluto restituito in una variabile e utilizzarlo in un secondo momento con EXEC per avviare il programma senza dover ripetere la procedura di ricerca.
Sintassi rapida
Se usi la seconda forma della sintassi,
EXEC Command TO Variable
l'interprete attende il completamento del comando, quindi inserisce l'output del comando completo nella stringa specificata.
Durante l'esecuzione del comando non si ha controllo sul processo in esecuzione.
Viene recuperato solo lo standard output del processo. L'output dell'errore non viene reindirizzato.
Ambiente
È possibile specificare nuove variabili di ambiente per il processo in esecuzione utilizzando la parola chiave
WITH subito dopo l'argomento command:
[ Process = ] EXEC Command WITH Environment ...
Environment è un array di stringhe, ogni stringa ha il seguente formato:
"NAME=VALUE"
.
NAME
è il nome della variabile di ambiente,
VALUE
è il suo valore.
Se vuoi cancellare una variabile d'ambiente, usa la stringa
"NAME="
.
Esecuzione all'interno di un terminale virtuale
Se il processo viene eseguito all'interno di un terminale virtuale, ovvero se si utilizza la sintassi
FOR INPUT /
OUTPUT, è possibile inviare caratteri di controllo allo standard input del processo per ottenere lo stesso effetto che si otterrebbe in un vero terminale.
^C
interrompe il processo,
^Z
lo sospende e così via.
Un terminale virtuale ha una sola uscita. Di conseguenza, l'output di errore standard del processo in esecuzione viene ricevuto tramite l'evento Reed
.
Alcuni programmi dispongono di un'interfaccia a riga di comando accessibile solo se in esecuzione all'interno di un terminale virtuale.
Se si prevede di controllare un'applicazione inviando comandi allo standard input, il test deve essere eseguito al di fuori dell'IDE (ovvero creare un eseguibile e avviarlo dalla riga di comando) poiché la console all'interno dell'ambiente di sviluppo non è un vero terminale virtuale e causa risultati inaspettati.
La console della IDE è ora un vero emulatore di terminale dalla versione 3.9 di Gambas.
Esempi
' Ottiene il contenuto di una directory
EXEC [ "ls", "-la", "/tmp" ] WAIT
' Ottiene il contenuto di una directory in una stringa
DIM sOutput AS String
EXEC [ "ls", "-la", "/tmp" ] TO sOutput
Print sOutput
' Come dare un valore a un'opzione: Stampa il contenuto della directory /tmp, eccetto
' le directory temporanee di gambas, usando l'opzione --hide di ls.
' O usa = per separare l'opzione lunga dal valore e metterli entrambi in un membro dell'array
Exec ["ls", "-l", "--hide=*gambas*", "/tmp"] Wait
' Oppure usa un nuovo membro dell'array. Questo deve essere fatto con le opzioni brevi.
Exec ["ls", "-l", "--hide", "*gambas*", "/tmp"] Wait
' Ottiene il contenuto di una directory in una stringa, ma in background
Public sOutput As String
Public Sub Main()
' Viene usato un nome specifico di evento
Exec ["ls", "-la", "/tmp"] For Read As "Contents"
End
Public Sub Contents_Read()
Dim sLine As String
Read #Last, sLine, -256
sOutput &= sLine
End
Public Sub Contents_Kill()
Print sOutput
End
Se vuoi sapere quanti byte puoi leggere in un gestore di eventi
Process_Read
, usa la funzione
Lof.
Poiché gli argomenti vengono inviati direttamente al processo, non è necessario citarli, come occorre fare in una shell.
' perl -e 'print while <>;' diventa
EXEC [ "perl", "-e", "print while <>;" ] FOR READ WRITE
Vedi anche