SqueakまたはPharoからのシェルコマンドの呼び出し
質問
SqueakとPharoからシェルコマンドを呼び出すにはどうすればよいですか?これらの環境には、外部シェルコマンドを実行する特定のUNIX言語のsystem()関数、またはバックティック(ここではエディターに実行させることはできませんが、&quotの左キーを押したときに取得するもの) ; 1"以上" TAB")コマンドの出力をキャプチャしますか?
解決
Squeakでは、 CommandShell を使用できますが、何がわからないのか(もしあれば) )は現時点でPharoで利用可能です。
他のヒント
OSProcessパッケージを使用して、必要な処理を実行できると思います。さらに、squeak-devまたはpharoのメーリングリストで質問することをお勧めします。
2つの解決策があります:
ProcessWrapperパッケージを使用します。長所:すばやく簡単にインストールできます。短所:制限された機能、win32のみ。
パッケージOSProcess / CommandShellを使用します。長所:かなり優れた機能(パイプ、環境変数、シェルのようなワークスペースなど)、およびクロスプラットフォーム。短所:外部プラグインをビルドするには、VMMakerツールを使用する必要があります。
Pharo 6でWindows 10を使用していますが、 OSProcess
または OSSubprocess
クラスを使用することは実行不可能でした(インストールが難しいか、最新バージョンがサポートされていません) Windows)。
私にとって役立つのはLibCです。コマンド内で 2>
を使用して、stderrをファイルにリダイレクトできます。
errors := '/tmp/errors.txt'.
result := LibC uniqueInstance system:
'echo "Hello World" > /tmp/hello.txt 2>', errors.
result = 0 ifFalse: [ errors asFileReference ]
を使用して環境変数を操作することは可能です(ただし、Windowsでは失敗を意味する1の値を返します):
OSEnvironment current setEnv: 'MY_ENVIRONMENT_VARIABLE' value: '1'.
ただし、現在のディレクトリを変更できませんでした:
OSEnvironment current changeDirectoryTo: myDirectory asFileReference. "--> doesNotUnderstand for Windows"
回避策は、コマンド内でCDを実行することです:
result := LibC uniqueInstance system:
'cd ', myDirectory, ' && ls > /tmp/output.txt 2>', errors.
Windowsでは、Win APIにラッパーがあり、これを実行できます。
| 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
そこにあるプロセスでWindowsができることのほとんどをサポートしています(env、...)
だから、OSWindowsのカタログを見てください。