| #! /usr/bin/env python | |
| """repeat <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. | |
| 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 True: | |
| 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() |