Invocar comandos de shell de Squeak o Pharo
Pregunta
¿Cómo puedes invocar comandos de shell desde Squeak y Pharo? ¿Tienen estos entornos algo como la función system () en ciertos lenguajes de Unix para ejecutar comandos de shell externos, o los backticks (no pueden hacer que aquí le hagan al editor, pero lo que obtienes cuando presionas la tecla a la izquierda de " ; 1 '' y superior '' TAB '') para capturar la salida de los comandos?
Solución
En Squeak puede usar CommandShell , pero no sé qué (si algo ) está disponible para Pharo en este momento.
Otros consejos
Creo que puede usar el paquete OSProcess para hacer lo que quiera. Además, creo que es mejor preguntar en squeak-dev o pharo mailing list.
Tienes dos soluciones:
Use el paquete ProcessWrapper. Pros: instalación rápida y fácil. Contras: funcionalidad limitada, solo en win32.
Use el paquete OSProcess / CommandShell. Pros: bastante buena funcionalidad (tuberías, variables de entorno, espacio de trabajo tipo shell ...) y multiplataforma. Contras: debe usar las herramientas de VMMaker para compilar el complemento externo.
Estoy usando Windows 10 con Pharo 6, y me pareció inviable usar las clases OSProcess
o OSSubprocess
(difícil de instalar o las últimas versiones no son compatibles para Windows).
Lo que funciona para mí es LibC. Puede redirigir stderr a un archivo usando 2 >
dentro del comando:
errors := '/tmp/errors.txt'.
result := LibC uniqueInstance system:
'echo "Hello World" > /tmp/hello.txt 2>', errors.
result = 0 ifFalse: [ errors asFileReference ]
Es posible manipular las variables de entorno usando (aunque devuelve un valor de 1 que implica una falla en Windows):
OSEnvironment current setEnv: 'MY_ENVIRONMENT_VARIABLE' value: '1'.
Sin embargo, no pude cambiar el directorio actual:
OSEnvironment current changeDirectoryTo: myDirectory asFileReference. "--> doesNotUnderstand for Windows"
La solución es hacer un CD dentro del comando:
result := LibC uniqueInstance system:
'cd ', myDirectory, ' && ls > /tmp/output.txt 2>', errors.
En Windows, hay un contenedor en la API de Win que le permite hacer esto:
| 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
Hay mucho soporte para la mayoría de lo que Windows puede hacer con los procesos allí (env, ...)
Entonces, busque en el catálogo de OSWindows.