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