| #! /usr/bin/env python3 |
| |
| """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() |