【问题标题】:Invoking shell commands from Squeak or Pharo从 Squeak 或 Pharo 调用 shell 命令
【发布时间】:2009-09-13 01:40:10
【问题描述】:

如何从 Squeak 和 Pharo 调用 shell 命令?这些环境中是否有任何东西,比如某些 unix 语言中的 system() 函数来运行外部 shell 命令,或者反引号(不能让它们在这里对编辑器起作用,但是当你按下“左键”时你会得到什么1" 及以上"TAB") 来捕获命令的输出?

【问题讨论】:

    标签: smalltalk squeak pharo


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      在 Squeak 中,您可以使用 CommandShell,但我不知道目前 Pharo 可以使用什么(如果有的话)。

      【讨论】:

      • OSProcess 将运行 shell 命令。如果你需要输出或者你想在图像中使用 GUI 终端,你只需要 CommandShell。
      【解决方案3】:

      Squeak/Pharo 对 Shell 的支持非常有限。有计划对此进行改进;见Coralproject。欢迎您的贡献。

      【讨论】:

        【解决方案4】:

        您有两种解决方案:

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

        使用包 OSProcess/CommandShell。优点:非常好的功能(管道、环境变量、类似 shell 的工作区......)和跨平台。缺点:必须使用 VMMaker 工具来构建外部插件。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            我正在使用带有 Pharo 6 的 Windows 10,发现使用 OSProcessOSSubprocess 类是不可行的(难以安装或 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.
            

            【讨论】:

              猜你喜欢
              • 2023-03-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-01-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多