Aufrufen von Shellbefehlen aus Squeak oder Pharo
Frage
Wie können Sie Shell -Befehle von Squeak und Pharo aufrufen? Haben diese Umgebungen in bestimmten Unix -Sprachen irgendetwas in ihnen wie die Funktion System (), um externe Shellbefehle oder die Backticks auszuführen (kann sie hier nicht mit dem Editor tun, aber was Sie erhalten, wenn Sie die Schlüssel links drücken. " 1 "und über" Registerkarte "), um die Ausgabe von Befehlen zu erfassen?
Lösung
In Quietschen können Sie verwenden Befehlshell, aber ich weiß nicht, was (wenn überhaupt) zu diesem Zeitpunkt für Pharo verfügbar ist.
Andere Tipps
Ich denke, Sie können das Paket OSProcess verwenden, um das zu tun, was Sie wollen. Außerdem denke ich, dass es besser ist, in Squeak-Dev oder Pharo Mailing-Liste zu fragen.
Sie haben zwei Lösungen:
Verwenden Sie den Paketprozesswrapper. Vorteile: Schnelle und einfache Installation. Nachteile: begrenzte Funktionalität, nur auf Win32.
Verwenden Sie das Paket OsProcess/Commandshell. Vorteile: Ziemlich gute Funktionalität (Rohre, Umgebungsvars, Shell-ähnlicher Arbeitsbereich ...) und Cross-Plattform. Nachteile: Muss VMMAKER -Tools verwenden, um das externe Plugin zu erstellen.
Ich benutze Windows 10 mit Pharo 6 und fand es unmöglichkeit, die zu verwenden OSProcess
oder OSSubprocess
Klassen (schwer zu installieren oder die neuesten Versionen werden für Windows nicht unterstützt).
Was für mich funktioniert, ist libc. Sie können Stderr zu einer Datei mithilfe der Datei umleiten 2>
Innerhalb des Befehls:
errors := '/tmp/errors.txt'.
result := LibC uniqueInstance system:
'echo "Hello World" > /tmp/hello.txt 2>', errors.
result = 0 ifFalse: [ errors asFileReference ]
Es ist möglich, die Umgebungsvariablen zu manipulieren (obwohl er einen Wert von 1 zurückgibt, was ein Fehler in Windows impliziert):
OSEnvironment current setEnv: 'MY_ENVIRONMENT_VARIABLE' value: '1'.
Ich konnte das aktuelle Verzeichnis jedoch nicht ändern:
OSEnvironment current changeDirectoryTo: myDirectory asFileReference. "--> doesNotUnderstand for Windows"
Die Problemumgehung besteht darin, CD innerhalb des Befehls zu machen:
result := LibC uniqueInstance system:
'cd ', myDirectory, ' && ls > /tmp/output.txt 2>', errors.
Unter Windows befindet sich eine Wrapper auf der Win -API, mit der Sie dies tun können:
| 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
Es gibt viel Unterstützung für das meiste, was Windows mit Prozessen drin machen kann (Env, ...)
Schauen Sie sich also den Katalog nach Oswindows an.