Documentation de Gambas - /lang/exec

/lang/exec
Le page anglaise est plus récente.

# EXEC

[ Process = ] EXEC Command [ WAIT ] [ FOR { { READ | INPUT } | { WRITE | OUTPUT } } ] [ AS Name ]
EXEC Command TO Variable

Exécute une commande. Un objet interne Process est créé pour gérer la commande.

## Syntaxe standard

La commande passée à EXEC doit être spécifiée soit comme une liste de constantes chaîne de caractères séparées par des virgules, soit comme un tableau. Le premier élément de la liste/tableau est le nom de la commande, et les autres sont les paramètres optionnels de la commande.

- Si `WAIT` est indiqué, alors l'interpréteur attend la fin de l'exécution de la commande. Sinon, la commande est exécutée en arrière plan.

- SI `FOR` est spécifié, alors les entrées-sorties de la commande sont redirigées et c'est votre programme qui les intercepte:

  - Si `WRITE` est spécifié, vous pouvez envoyer des données a l'entrée standard de la commande en utilisant l'objet Process avec des instructions de sortie communes: PRINT, WRITE, ... Notez que vous avez besoin d'une référence vers l'objet Process pour cela.

  - Si `READ` est spécifié, alors les évènements seront générés chaque fois que la commande enverra des données vers son (flux) de sortie standard: l'évènement Read est généré quand les données sont envoyées au flux standard de sortie, et l'évènement Error est déclenché quand des données sont envoyées vers le flux d'erreur standard. Utilisez l’objet process avec les flux Flux & fonctions d'Entrée/Sortie pour lire la sortie standard du processus.

Si vous utilisez les mots clef `INPUT` et `OUTPUT` au lieu de `READ` et `WRITE`, alors le processus est exécuté dans un terminal virtuel. Cela signifie que le processus va croire qu'il fonctionne dans un vrai terminal.

`Nom` est le nom d'événement utilisé par l'objet Process. Par défaut, `"Process"` est le nom utilisé.

Dans Gambas 3, il n’y a plus de nom d’évènement par défaut.

Autrement dit, vous devez ajouter

    AS "Process"

Pour avoir le même comportement que Gambas 2.

Vous pouvez avoir une référence vers l'objet interne Process créé en utilisant une affectation.

## Syntaxe courte

Si vous utilisez la deuxième forme de la syntaxe, la commande est exécutée, l'interprèteur attend la fin de son exécution, puis la sortie de la commande achevée ast placée dans la chaîne spécifiée.

Pendant l’exécution de la commande, vous n'avez aucun contrôle sur le déroulement du processus exécuté.

## Environnement

Vous pouvez spécifier de nouvelles variables d'environnement pour le processus en execution en utilisant le mot clé WITH juste après l'argument command:

[ Process = ] EXEC 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="`.

### Exemples

    ' Récupère le contenu d'un répertoire
    EXEC [ "ls", "-la", "/tmp" ] WAIT

    ' Récupère le contenu d'un répertoire dans une chaîne de caractères
    DIM sOutput AS String
    EXEC [ "ls", "-la", "/tmp" ] TO sOutput

    ' Récupère le contenu d'un répertoire dans une chaîne de caractères, mais en arrière plan
    DIM sOutput AS String

    ' Un nom d'événement spécifique est utilisé
    EXEC [ "ls", "-la", "/tmp" ] FOR READ AS "Contents"

    ...

    PUBLIC SUB Contenu_Read()

      DIM sLine AS String

      READ #LAST, sLine, -256

      sOutput &= sLine

    END

    PUBLIC SUB Contenu_Kill()

      PRINT sOutput

    END

Si vous voulez connaître combien d'octets vous pouvez lire dans un gestionnaire d'évènement `Process_Read`, utilisez la fonction Lof.

Comme les arguments sont envoyés directement au processus, vous n'avez pas à les mettre entre guillemets, comme vous devez le faire avec le shell.

### Exemples

    ' perl -e 'print while <>;' devient

    EXEC [ "perl", "-e", "print while <>;" ] FOR READ WRITE

### Voir aussi

- Gestion des processus

- Process

- Lof

- Différences entre Shell et Exec