Invocation de commandes shell depuis Squeak ou Pharo
Question
Comment pouvez-vous appeler des commandes shell de Squeak et Pharo? Ces environnements ont-ils quelque chose en eux, comme la fonction system () de certains langages Unix pour exécuter des commandes de shell externes, ou les backticks (vous ne pouvez pas les faire faire ici à l'éditeur, mais ce que vous obtenez en appuyant sur la touche gauche de " ; 1 "et plus" "TAB") pour capturer le résultat des commandes?
La solution
Dans Squeak, vous pouvez utiliser CommandShell , mais je ne sais pas quoi (le cas échéant). ) est actuellement disponible pour Pharo.
Autres conseils
Je pense que vous pouvez utiliser le package OSProcess pour faire ce que vous voulez. En outre, je pense qu'il est préférable de demander dans la liste de diffusion squeak-dev ou pharo.
Vous avez deux solutions:
Utilisez le package ProcessWrapper. Avantages: installation rapide et facile. Inconvénients: fonctionnalités limitées, uniquement sur win32.
Utilisez le package OSProcess / CommandShell. Avantages: fonctionnalités plutôt bonnes (pipes, environnement, espace de travail en forme de shell, etc.) et multi-plateformes. Inconvénients: utiliser les outils VMMaker pour créer le plug-in externe.
J'utilise Windows 10 avec Pharo 6 et j'ai trouvé impossible d'utiliser les classes OSProcess
ou OSSubprocess
(difficiles à installer ou les dernières versions ne sont pas prises en charge. Windows).
Ce qui fonctionne pour moi, c'est LibC. Vous pouvez rediriger stderr vers un fichier en utilisant 2 >
dans la commande:
errors := '/tmp/errors.txt'.
result := LibC uniqueInstance system:
'echo "Hello World" > /tmp/hello.txt 2>', errors.
result = 0 ifFalse: [ errors asFileReference ]
Il est possible de manipuler les variables d'environnement à l'aide de (bien qu'il renvoie une valeur de 1 impliquant un échec sous Windows):
OSEnvironment current setEnv: 'MY_ENVIRONMENT_VARIABLE' value: '1'.
Cependant, je n'ai pas pu modifier le répertoire actuel:
OSEnvironment current changeDirectoryTo: myDirectory asFileReference. "--> doesNotUnderstand for Windows"
La solution consiste à créer un CD dans la commande:
result := LibC uniqueInstance system:
'cd ', myDirectory, ' && ls > /tmp/output.txt 2>', errors.
Sous Windows, un API sur l’API Win vous permet de faire ceci:
| sqlPlusExe sqlPlusRunInDir scriptPathString|
scriptPathString := (FileLocator imageDirectory / 'data' / 'sqlplus' / 'testquit.sql') pathString.
sqlPlusExe :='C:\oraclexe\app\oracle\product\11.2.0\server\bin\sqlplus.exe /nolog @' , scriptPathString.
sqlPlusRunInDir := 'C:\oraclexe\app\oracle\product\11.2.0\server\bin'.
sqlPlusWinProcessInformation := WinProcess
createAndWaitForProcess: sqlPlusExe
withCurrentDirectory: sqlPlusRunInDir
Il existe beaucoup de support pour la plupart de ce que Windows peut faire avec les processus qu'il contient (env, ...)
Alors, cherchez dans OSWindows dans le catalogue.