5 ms·
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
by geophile 16y ago
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.