是否可以在Pharo smalltalk中编写shell命令?

时间:2018-07-16 13:35:38

标签: linux shell smalltalk pharo pharo-5

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

1 个答案:

答案 0 :(得分:7)

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,您将获得initialStdInstdin),initialStdOutstdout),initialStdErrorstderr)。

要将来自 Pharo的写入终端

  1. 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.
    

检查您的外壳,您应该在那里看到输出。

  1. 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'

就是这样。