如何从 Squeak 和 Pharo 调用 shell 命令?这些环境中是否有任何东西,比如某些 unix 语言中的 system() 函数来运行外部 shell 命令,或者反引号(不能让它们在这里对编辑器起作用,但是当你按下“左键”时你会得到什么1" 及以上"TAB") 来捕获命令的输出?
6 回答
我认为你可以使用包 OSProcess 来做你想做的事。另外,我认为最好在 squeak-dev 或 pharo 邮件列表中询问。
在 Squeak 中,您可以使用CommandShell,但我不知道目前 Pharo 可以使用什么(如果有的话)。
你有两个解决方案:
使用包 ProcessWrapper。优点:安装快速简便。缺点:功能有限,仅在win32上。
使用包 OSProcess/CommandShell。优点:非常好的功能(管道、环境变量、类似 shell 的工作区......)和跨平台。缺点:必须使用 VMMaker 工具来构建外部插件。
在 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 可以对其中的进程执行的大部分操作(环境,...),有很多支持
因此,请查看 OSWindows 的目录。
我正在使用带有 Pharo 6 的 Windows 10,发现使用OSProcess
orOSSubprocess
类是不可行的(难以安装或 Windows 不支持最新版本)。
对我有用的是LibC。您可以使用命令内部将 stderr 重定向到文件2>
:
errors := '/tmp/errors.txt'.
result := LibC uniqueInstance system:
'echo "Hello World" > /tmp/hello.txt 2>', errors.
result = 0 ifFalse: [ errors asFileReference ]
可以使用以下方法操作环境变量(尽管它返回值 1 表示 Windows 中的失败):
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.