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?

¿Fue útil?

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.

El soporte de Shell en Squeak / Pharo es bastante limitado. Hay planes para mejorar esto; vea el Coral proyecto . Sus contribuciones son bienvenidas.

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 

 ingrese la descripción de la imagen aquí

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.

 ingrese la descripción de la imagen aquí

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top