就像其他编程语言一样,是否可以在Pharo smalltalk或简单脚本中运行linux shell命令?我想让我的Pharo图像运行一个脚本,该脚本应该能够自动执行任务并将其返回到某个值。我查看了几乎所有的文档,但找不到任何相关的内容。也许它不允许这种功能。
答案 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:stdin
,stdout
和stderr
。这些您需要与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.
检查您的外壳,您应该在那里看到输出。
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'
就是这样。