59 lines
1.5 KiB
Python
59 lines
1.5 KiB
Python
|
#! /usr/bin/env python
|
||
|
|
||
|
"""repeat <shell-command>
|
||
|
|
||
|
This simple program repeatedly (with 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 1:
|
||
|
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()
|