===== Pipes ===== A :class:`~chut.Pipe` is a group of one or more command. By default all commands are lazy. It mean that they are not executed until you want a result (output). You can always check what a :class:`~chut.Pipe` will execute with ``print(repr(pipe))`` .. >>> import chut as sh >>> sh.env.lc_all = 'C' The pipe context manager ======================== A context manager can help you to check for some errors:: >>> from chut import cat, grep >>> with sh.pipes(cat('fff') | grep('fff')) as p: # doctest: +ELLIPSIS ... print(p) Traceback (most recent call last): ... OSError: cat: fff: No such file or directory Basically it checks return codes at the end of the pipe Use predefined pipe ==================== Define an pipe:: >>> chut = cat('README.rst') | grep('chut') And use it:: >>> chut | sh.head('-n1') 'cat README.rst | grep chut | head -n1' The original defined pipe stay as this (everything is copied):: >>> chut 'cat README.rst | grep chut' You can also extract parts of the pipe using slices:: >>> chut[1:] 'grep chut' Use python !! ============= You can use some python code ad the end of the pipe (and only at the end):: >>> @sh.wraps ... def check_chut(stdin): ... for line in stdin: ... if line.startswith(b'Chut'): ... yield b'Chut rocks!\n' ... break >>> with sh.pipes(cat('README.rst') | check_chut) as cmd: ... for line in cmd: ... print(line) Chut rocks! Access binaries outside of PATH ================================ You can use ``pipe`` to get some binaries:: >>> sh.pipe('/opt/foo/bin/bar --help') '/opt/foo/bin/bar --help' You can also use getitem:: >>> sh['/opt/foo/bin/bar']('--help') '/opt/foo/bin/bar --help' Or getattr...:: >>> getattr(sh, '/opt/bar/bin/foo')('--help') '/opt/bar/bin/foo --help'