Hacker News new | past | comments | ask | show | jobs | submit login

Piping objects means that I'm dealing with objects, not string representations of objects. I'd much rather operate on a Process object than have to parse output from the ps command. For example, to find the processes whose parent is pid 987 (addressing snprbob86), I would write this on the command line in object shell:

    osh ps ^ select 'p: p.parent.pid == 987' ^ f 'p: (p.pid, p.commandline)' $
This invokes the Object Shell executable -- osh, a Python program, passing eight arguments (ps, ^, select, ...). ^ denotes piping. The select command selects processes, p, for which that parent pid is 987. discarding others. f applies a function to selected processes, p, returning tuples containing p's pid and commandline. $ prints the selected tuples to stdout.

Note that the piping is internal to the osh process, avoiding serialization to/from string between commands. That's much faster. (The initial version of Object Shell used OS piping, and spent a lot of time serializing and deserializing.)

Passing objects between servers does, of course, require serialization. So if I want to get a listing of pids and commandlines on every node of my cluster named foo:

    osh @foo [ ps ^ f 'p: (p.pid, p,commandline)' ] $
@foo looks up the definition of the cluster named foo (in ~/.oshrc or in /etc/oshrc) and runs the bracketed command on each node. The resulting (pid, commandline) tuples are serialized, sent back, deserialized and printed.

By the way, Object Shell has a Python API also. So the same remote command would be:

    #!/usr/bin/python

    from osh.api import *

    osh(remote('foo',
               [ps, f('p: (p.pid, p.commandline)')],
               out()))
Objects rule, in programs and on the command line.



Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: