如何从Squeak和Pharo调用shell命令?这些环境中是否包含某些unix语言中的system()函数以运行外部shell命令,或者反引号(无法在此处对编辑器执行这些操作,但是当您按下左键时所获得的内容) ; 1"以及“TAB”)以捕获命令的输出?

有帮助吗?

解决方案

在Squeak中你可以使用 CommandShell ,但我不知道是什么(如果有的话) )此时Pharo可以使用。

其他提示

我认为你可以使用OSProcess包来做你想要的。另外,我认为最好在squeak-dev或pharo邮件列表中询问。

Squeak / Pharo的壳牌支持非常有限。有计划改善这一点;请参阅珊瑚 项目。欢迎您的贡献。

您有两种解决方案:

使用ProcessWrapper包。优点:快速简便的安装。缺点:功能有限,仅限win32。

使用包OSProc / CommandShell。优点:相当不错的功能(管道,环境变量,类似shell的工作空间......)和跨平台。缺点:必须使用VMMaker工具来构建外部插件。

我正在使用带有Pharo 6的Windows 10,并发现使用 OSProcess OSSubprocess 类是不可行的(难以安装或不支持最新版本)窗口)。

对我来说有用的是LibC。您可以使用命令中的 2> 将stderr重定向到文件:

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.

在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的目录。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top