Invocação de comandos do shell do Squeak ou Pharo
Pergunta
Como você pode chamar comandos do shell do Squeak e Pharo?Fazer esses ambientes têm nada deles, como a função system() em determinados unix idiomas para executar externo comandos de shell, ou as aspas invertidas (não pode torná-los aqui fazer para o editor, mas o que você ganha quando você pressiona a tecla esquerda do "1" e, acima de "GUIA") para capturar a saída de comandos?
Solução
Em squeak você pode usar Commandshell, mas não sei o que (se alguma coisa) está disponível para o Pharo neste momento.
Outras dicas
Eu acho que você pode usar o pacote Osprocess para fazer o que quiser. Além disso, acho melhor perguntar na lista de discussão Squeak-Dev ou Pharo.
Você tem duas soluções:
Use o pacote ProcessWrapper. Prós: instalação rápida e fácil. Contras: funcionalidade limitada, apenas no Win32.
Use o pacote Osprocess/Commandshell. Prós: Funcionalidade muito boa (tubos, vars de ambiente, espaço de trabalho do tipo Shell ...) e plataforma cruzada. Contras: deve usar as ferramentas VMMMAKer para criar o plug -in externo.
Eu estou usando o Windows 10 com Pharo 6, e encontrou-o inviável para o uso OSProcess
ou OSSubprocess
classes (disco rígido para instalar ou as versões mais recentes não são suportados para Windows).
O que funciona para mim é LibC.Você pode redirecionar stderr para um arquivo usando 2>
dentro do comando:
errors := '/tmp/errors.txt'.
result := LibC uniqueInstance system:
'echo "Hello World" > /tmp/hello.txt 2>', errors.
result = 0 ifFalse: [ errors asFileReference ]
É possível manipular as variáveis de ambiente usando (embora ele retorna um valor de 1 implicar uma falha no Windows):
OSEnvironment current setEnv: 'MY_ENVIRONMENT_VARIABLE' value: '1'.
No entanto, eu era incapaz de alterar o directório actual:
OSEnvironment current changeDirectoryTo: myDirectory asFileReference. "--> doesNotUnderstand for Windows"
A solução é fazer o CD com o comando:
result := LibC uniqueInstance system:
'cd ', myDirectory, ' && ls > /tmp/output.txt 2>', errors.
No Windows, há um invólucro na API WIN, permitindo que você faça isso:
| 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
Há muito suporte para a maior parte do que as janelas podem fazer com os processos lá (Env, ...)
Portanto, olhe no catálogo para oswindows.