与其他编程语言一样,是否可以在Pharo smalltalk或简单脚本中运行linux shell命令?我想让我的Pharo图像运行一个脚本,该脚本应该能够自动执行任务并将其返回到某个值。我查看了几乎所有文档,但找不到任何相关内容。也许它不允许这种功能。

最佳答案

Pharo确实允许操作系统交互。在我眼中,最好的方法是使用OSProcess(正如MartinW已经建议的那样)。
那些认为是重复的人缺少此部分:

invoking shell commands from squeak or pharo中与返回值无关
要获得返回值,您可以通过以下方式进行操作:

command := OSProcess waitForCommand: 'ls -la'.
command exitStatus.
如果打印出以上代码,则很可能会获得0作为成功。
如果您犯了一个明显的错误:
command := OSProcess waitForCommand: 'ls -la /dir-does-not-exists'.
command exitStatus.
在我的情况下,您将获得~= 0的值512
编辑,添加更多详细信息以覆盖更多地面
我同意eMBee的声明

相当模糊。我正在添加有关I/O的信息。
您可能知道三个基本的IO:stdinstdoutstderr。这些您需要与Shell进行交互。我将首先添加这些示例,然后再回到您的描述。
它们每个都由Pharo中的AttachableFileStream实例表示。对于上述command,您将获得initialStdIn(stdin),initialStdOut(stdout),initialStdError(stderr)。
要将写入 Pharo终端中,请执行以下操作:
  • stdout和stderr(您将字符串流式传输到终端)
    | process |
    
    process := OSProcess thisOSProcess.
    process stdOut nextPutAll: 'stdout: All your base belong to us'; nextPut: Character lf.
    process stdErr nextPutAll: 'stderr: All your base belong to us'; nextPut: Character lf.
    

  • 检查您的 shell ,您应该在那里看到输出。
  • stdin-获得您输入的内容
    | userInput handle fetchUserInput |
    
    userInput := OSProcess thisOSProcess stdIn.
    handle := userInput ioHandle.
    "You need this in order to use terminal -> add stdion"
    OSProcess accessor setNonBlocking: handle.
    fetchUserInput := OS2Process thisOSProcess stdIn next.
    "Set blocking back to the handle"
    OSProcess accessor setBlocking: handle.
    "Gets you one input character"
    fetchUserInput inspect.
    

  • 如果要从抓取输出,将命令转换为 Pharo,则一种合理的方法是使用PipeableOSProcess,从他的名字可以明显看出,它可以与管道结合使用。
    简单的例子:
    | commandOutput |
    
    commandOutput := (PipeableOSProcess command: 'ls -la') output.
    commandOutput inspect.
    
    更复杂的示例:
    | commandOutput |
    
    commandOutput := ((PipeableOSProcess command: 'ps -ef') | 'grep pharo') outputAndError.
    commandOutput inspect.
    
    由于拼写错误,我喜欢使用outputAndError。如果您输入的命令不正确,则会收到错误消息:
    | commandOutput |
    
    commandOutput := ((PipeableOSProcess command: 'ps -ef') | 'grep pharo' | 'cot') outputAndError.
    commandOutput  inspect.
    
    在这种情况下,'/bin/sh: cot: command not found'就是这样。
    更新29-3-2021 OSProcess可以在Pharo 7上运行。尚未升级以与Pharo 8或更高版本上的更改一起使用。

    关于linux - 是否可以在Pharo smalltalk中编写shell命令?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51363155/

    10-13 05:24