SHELL
[ Process = ] SHELL Command [ WAIT ] [ FOR { { READ | INPUT } | { WRITE | OUTPUT } } ] [ AS Name ]
SHELL Command TO Variable
Exécute une commande en lançant un process enfant dans un "shell" système. Un objet de
Process interne est créé pour gérer la commande.
Syntaxe standard
La commande est une chaîne contenant une commande passée au shell (
/bin/sh
).
-
Si
WAIT
est spécifié, alors l'interpréteur attend que la commande se termine. Sinon, la commande est exécutée en arrière-plan.
Ne pas oublier le mot clef WAIT si vous voulez chaîner les commandes, sinon la seconde commande va démarrer avant la fin de la première !
-
Si
FOR
est spécifié, alors les commandes d'entrée-sorties sont redirigés de telle sorte que votre programme les intercepte :
-
Si
WRITE
est spécifié, alors vous pouvez envoyer des données à l'entrée standard de commande en utilisant l'objet Process avec les instructions de sortie usuelles : PRINT, WRITE, ... Notez que vous avez besoin d'une référence à l'objet Process pour cela.
-
Si
READ
est spécifié, alors des évènements seront générés à chaque fois que la commande envoie des données à son flux de sortie standard : l'évènement Read est levé quand les données sont envoyées au flux de sortie standard, et l'évènement Error est levé quand les données sont envoyées au flux d'erreur standard. Utilisez l'objet process avec les Fonctions de flux et d'entrée/sortie pour lire la sortie standard du process :
-
Si vous utilisez les mots clefs
INPUT
et OUTPUT
à la place de READ
et WRITE
, alors le processus sera exécuté dans un terminal virtuel. Cela signifie que le processus pensera qu'il est exécuté dans un vrai terminal.
-
Name
est le nom d'évènement utilisé par l'objet de Process. Par défaut, c'est "Process"
.
Dans Gambas 3, il n’y a plus d’évènement par défaut.
Autrement dit, vous devez ajouter
AS "Process"
pour avoir le même comportement que dans Gambas 2.
Vous pouvez obtenir une référence à l'objet de
Process interne créé en utilisant une affectation.
Syntaxe rapide
Si vous utilisez la seconde syntaxe, la commande est exécutée, l'interpréteur attend la fin de la commande, et la sortie de la commande complète est mise dans la chaîne indiquée.
Vous n’avez pas de contrôle sur le processus exécuté.
Seule la sortie standard du processus est récupérée. La sortie erreur n'est pas redirigée.
Si vous avez besoin de mixer les deux sorties, utilisez la syntaxe de redirection du shell :
Shell "command 2>&1" To Result
Environnement
Vous pouvez spécifier de nouvelles variables d’environnement pour le processus qui tourne en utilisant le mot-clé
WITH juste après l’argument de commande :
[ Process = ] SHELL Command WITH Environment ...
Environment est un tableau de chaînes, chacune ayant la forme suivante : :
"NAME=VALUE"
.
NAME
est le nom de la variable d’environnement,
VALUE
est sa valeur.
Si vous voulez effacer une variable d’environnement, utilisez simplement la chaîne
"NAME="
.
Exécuter dans un terminal virtuel
Si le processus est exécuté dans une terminal virtuel, c.-à-d. si vous utilisez la syntaxe
FOR INPUT /
OUTPUT, vous pouvez envoyer des caractères de contrôle à l’entrée standard du processus : cela produira le même effet que si vous les saisissiez dans un terminal réel.
^C
stoppe le processus,
^Z
le suspend, etc ..
}
Un terminal virtuel a une seule sortie. Par conséquent, la sortie erreur standard du processus en cours est reçue à travers l'évènement Read
.
certains programmes ont une interface en ligne de commande qui est seulement accessible s'ils sont lancés dans un terminal virtuel.
Si vous prévoyez de contrôler une application en envoyant des commandes à l'entrée standard alors les tests devraient être menés en dehors de l'IDE (c.-à-d. faire un exécutable et le lancer depuis la ligne de commande) car la console dans l'environnement de développement n'étant pas un vrai terminal virtuel, il causera des résultats inattendus.
Specifier le Shell
Depuis 3.1
Vous pouvez spécifier quel shell est utilisé pour lancer la commande avec la propriété
System.Shell.
par défaut, la commande shell est lancée depuis
/bin/sh
.
Mettre entre guillemets les arguments
Puisque les arguments sont envoyés au shell, vous devez les entourer de guillemets, comme si vous tapiez la commande dans un terminal.
SHELL "perl -e 'print while <>;'" FOR READ WRITE
Ou vous pouvez utiliser la fonction
Shell$ pour créer une chaîne entre guillemets qui ne sera pas modifiée par le shell.
Exemples
' Récupère le contenu d'un répertoire et l'envoie sur la sortie standard.
Shell "ls -la /tmp" WAIT
' Récupère le contenu d'un répertoire dans une chaîne
Dim Result As String
Shell "ls -la /tmp" To Result
' Récupère le contenu d'un répertoire en arrière-plan
Dim Content 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
Si vous voulez savoir combien d'octets vous pouvez lire dans un gestionnaire d'évènement
Process_Read
, utilisez la fonction
Lof.
Contrairement à l'interpréteur de commande VB, qui retourne un ID de processus et se repose sur le programmeur pour appeler des API pour contrôler le processus, la fonction Shell de Gambas retourne facultativement un objet
Process (si utilisé comme une affectation à une variable déclarée comme
Process).
Il peut être utilisé pour tuer directement ou contrôler le processus généré. De plus, le processus peut être lancé de façon synchrone ou asynchrone, à la différence de son équivalent VB.
Voir aussi