Staging
v0.8.1
https://github.com/python/cpython
Revision 52915df4ddad5378f6c9c56e54089a42b29397e3 authored by Benjamin Peterson on 13 June 2009, 13:16:45 UTC, committed by Benjamin Peterson on 13 June 2009, 13:16:45 UTC
1 parent c7c1228
Raw File
Tip revision: 52915df4ddad5378f6c9c56e54089a42b29397e3 authored by Benjamin Peterson on 13 June 2009, 13:16:45 UTC
update the README to be a little more inspiring w/regards to stability
Tip revision: 52915df
repeat.py
#! /usr/bin/env python

"""repeat [-i SECONDS] <shell-command>

This simple program repeatedly (at 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.

The -i option lets you override the sleep time between executions.

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
import getopt

def main():
    interval = 1.0
    try:
        opts, args = getopt.getopt(sys.argv[1:], "hi:")
    except getopt.error as err:
        print(err, file=sys.stderr)
        sys.exit(2)
    if not args:
        print(__doc__)
        sys.exit(0)
    for opt, arg in opts:
        if opt == "-i":
            interval = float(arg)
        if opt == "-h":
            print(__doc__)
            sys.exit(0)
    cmd = " ".join(args)
    cmd_really = cmd + " 2>&1"
    p = os.popen(cmd_really, "r")
    text = p.read()
    sts = p.close()
    text = addsts(interval, cmd, text, sts)
    w = curses.initscr()
    try:
        while True:
            w.erase()
            try:
                w.addstr(text)
            except curses.error:
                pass
            w.refresh()
            time.sleep(interval)
            p = os.popen(cmd_really, "r")
            text = p.read()
            sts = p.close()
            text = addsts(interval, cmd, text, sts)
    finally:
        curses.endwin()

def addsts(interval, cmd, text, sts):
    now = time.strftime("%H:%M:%S")
    text = "%s, every %g sec: %s\n%s" % (now, interval, cmd, text)
    if sts:
        msg = "Exit status: %d; signal: %d" % (sts>>8, sts&0xFF)
        if text and not text.endswith("\n"):
            msg = "\n" + msg
        text += msg
    return text

main()
back to top