mirror of https://github.com/python/cpython
81 lines
2.2 KiB
Python
Executable File
81 lines
2.2 KiB
Python
Executable File
#! /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()
|