1 #! /usr/bin/env python
2 
3 """repeat <shell-command>
4 
5 This simple program repeatedly (at 1-second intervals) executes the
6 shell command given on the command line and displays the output (or as
7 much of it as fits on the screen).  It uses curses to paint each new
8 output on top of the old output, so that if nothing changes, the
9 screen doesn't change.  This is handy to watch for changes in e.g. a
10 directory or process listing.
11 
12 To end, hit Control-C.
13 """
14 
15 # Author: Guido van Rossum
16 
17 # Disclaimer: there's a Linux program named 'watch' that does the same
18 # thing.  Honestly, I didn't know of its existence when I wrote this!
19 
20 # To do: add features until it has the same functionality as watch(1);
21 # then compare code size and development time.
22 
23 import os
24 import sys
25 import time
26 import curses
27 
28 def main():
29     if not sys.argv[1:]:
30         print __doc__
31         sys.exit(0)
32     cmd = " ".join(sys.argv[1:])
33     p = os.popen(cmd, "r")
34     text = p.read()
35     sts = p.close()
36     if sts:
37         print >>sys.stderr, "Exit code:", sts
38         sys.exit(sts)
39     w = curses.initscr()
40     try:
41         while True:
42             w.erase()
43             try:
44                 w.addstr(text)
45             except curses.error:
46                 pass
47             w.refresh()
48             time.sleep(1)
49             p = os.popen(cmd, "r")
50             text = p.read()
51             sts = p.close()
52             if sts:
53                 print >>sys.stderr, "Exit code:", sts
54                 sys.exit(sts)
55     finally:
56         curses.endwin()
57 
58 main()
59