Staging
v0.5.1
https://github.com/python/cpython
Revision 5f55933b3a78b7f3557ac81a2411a1b50bffab33 authored by Georg Brandl on 05 March 2011, 13:54:46 UTC, committed by Georg Brandl on 05 March 2011, 13:54:46 UTC
1 parent a97ca43
Raw File
Tip revision: 5f55933b3a78b7f3557ac81a2411a1b50bffab33 authored by Georg Brandl on 05 March 2011, 13:54:46 UTC
Close 2.1 branch.
Tip revision: 5f55933
repeat.py
#! /usr/bin/env python

"""repeat <shell-command>

This simple program repeatedly (with 1-second intervals) executes the
shell command given on the command line and displays the output (or as
much of it as fits on the screen).  It uses curses to paint each new
output on top of the old output, so that if nothing changes, the
screen doesn't change.  This is handy to watch for changes in e.g. a
directory or process listing.

To end, hit Control-C.
"""

# Author: Guido van Rossum

# Disclaimer: there's a Linux program named 'watch' that does the same
# thing.  Honestly, I didn't know of its existence when I wrote this!

# To do: add features until it has the same functionality as watch(1);
# then compare code size and development time.

import os
import sys
import time
import curses

def main():
    if not sys.argv[1:]:
        print __doc__
        sys.exit(0)
    cmd = " ".join(sys.argv[1:])
    p = os.popen(cmd, "r")
    text = p.read()
    sts = p.close()
    if sts:
        print >>sys.stderr, "Exit code:", sts
        sys.exit(sts)
    w = curses.initscr()
    try:
        while 1:
            w.erase()
            try:
                w.addstr(text)
            except curses.error:
                pass
            w.refresh()
            time.sleep(1)
            p = os.popen(cmd, "r")
            text = p.read()
            sts = p.close()
            if sts:
                print >>sys.stderr, "Exit code:", sts
                sys.exit(sts)
    finally:
        curses.endwin()

main()
back to top