SHELL
[ Process = ] SHELL Command [ WAIT ] [ FOR { { READ | INPUT } | { WRITE | OUTPUT } } ] [ AS Name ]
SHELL Command TO Variable
Esegue un comando facendo girare un processo figlio attraverso una shell di sistema.
Un oggetto interno
Process viene creato per gestire il comando.
Sintassi standard
Il comando è una stringa contenente un comando passato alla shell di sistema (
/bin/sh
).
-
Se è specificato
WAIT
, l'interprete attende che il comando termini. Altrimenti, il comando viene eseguito in background.
Non dimenticare la parola chiave WAIT se vuoi concatenare i comandi, altrimenti il secondo inizierà prima della fine del primo comando!
-
Se è specificato
FOR
, il comando input-output viene reindirizzato in modo che il programma li intercetti:
-
Se è specificato
WRITE
, è possibile inviare dati allo standard input del comando utilizzando l'oggetto Process con le istruzioni di output comuni: PRINT, WRITE, ... Nota che per farlo hai bisogno di un riferimento all'oggetto Process.
-
Se viene specificato
READ
, gli eventi vengono generati ogni volta che il comando invia i dati agli stream di output standard: L'evento Read viene generato quando i dati vengono inviati agli stream di output standard e l'evento Error viene generato quando i dati vengono inviati allo stream degli errori standard. Utilizza 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 verrà eseguito all'interno di un terminale virtuale. Ciò significa che il processo riconoscerà se stesso 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.
È possibile ottenere un riferimento all'oggetto interno creato
Process utilizzando un assegnamento.
Sintassi veloce
Se si utilizza la seconda sintassi, il comando viene eseguito, l'interprete attende la sua fine e l'output del comando completo viene inserito nella stringa specificata.
Non hai alcun controllo sul processo eseguito.
Viene recuperato solo lo standard output del processo. L'output dell'errore non viene reindirizzato.
Se è necessario mixare entrambi gli output, utilizzare la sintassi di reindirizzamento della shell:
Shell "command 2>&1" To Result
Ambiente
È possibile specificare nuove variabili di ambiente per il processo in esecuzione utilizzando la parola chiave
WITH subito dopo l'argomento del comando:
[ Process = ] SHELL Command WITH Environment ...
Environment è una matrice di stringhe, ogni stringa ha la seguente forma:
"NAME=VALUE"
.
NAME
è il nome della variabile di ambiente,
VALUE
è il suo valore.
Se vuoi cancellare una variabile d'ambiente, usa semplicemente la stringa
"NAME="
.
In esecuzione all'interno di un terminale virtuale
Se il processo è in esecuzione all'interno di un terminale virtuale, ovvero se si utilizza la sintassi
FOR INPUT /
OUTPUT, è possibile inviare caratteri di controllo all'ingresso standard del processo per ottenere lo stesso effetto che otterremmo se li inserissimo all'interno di 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 Read
.
Alcuni programmi dispongono di un'interfaccia da 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 eseguire 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 a partire da Gambas 3.9.
Specificare la shell
Dal 3.1
È possibile specificare quale shell è utilizzata per eseguire il comando sovrascrivendo la proprietà
System.Shell.
Per impostazione predefinita, il comando shell viene eseguito tramite
/bin/sh
.
Quotare gli argomenti
Poiché gli argomenti vengono inviati a una shell, è necessario quotarli, come se si stesse digitando il comando in una schermata di terminale.
SHELL "perl -e 'print while <>;'" FOR READ WRITE
Oppure puoi usare la funzione
Shell$
per creare una stringa quotata che non verrà modificata dalla shell.
Esempi
' Ottiene il contenuto di una directory e lo stampa sullo standard output
Shell "ls -la /tmp" Wait
' Ottiene il contenuto di una directory in una stringa
Dim Result As String
Shell "ls -la /tmp" To Result
' Ottiene il contenuto di una directory in background
Dim Result AS String
Shell "ls -la /tmp" For Read As "Process"
...
Public Sub Process_Read()
Dim sLine AS String
sLine = Read #Last, -256
Result &= sLine
Print sLine;
End
Se vuoi conoscere quanti byte puoi leggere in un gestore di eventi
Process_Read
, usa la funzione
Lof.
A differenza del comando VB Shell, che restituisce un ID di processo e si affida al programmatore per effettuare chiamate API per controllare il processo, la funzione Shell Gambas restituisce facoltativamente un oggetto
Process (se usato come assegnazione a un variabile dichiarata con
AS) che può essere utilizzato per uccidere o controllare in altro modo il processo generato. Inoltre, il processo può essere eseguito in modo sincrono o asincrono, a differenza dell'equivalente VB
Vedi anche