Commit 8161a65c authored by Guido van Rossum's avatar Guido van Rossum

Add -i option. Don't exit when the command fails. Redirect stderr to stdout.

parent db4a2ef2
#! /usr/bin/env python
"""repeat <shell-command>
"""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
......@@ -9,6 +9,8 @@ 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.
"""
......@@ -24,18 +26,30 @@ import os
import sys
import time
import curses
import getopt
def main():
if not sys.argv[1:]:
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)
cmd = " ".join(sys.argv[1:])
p = os.popen(cmd, "r")
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()
if sts:
print("Exit code:", sts, file=sys.stderr)
sys.exit(sts)
text = addsts(interval, cmd, text, sts)
w = curses.initscr()
try:
while True:
......@@ -45,14 +59,22 @@ def main():
except curses.error:
pass
w.refresh()
time.sleep(1)
p = os.popen(cmd, "r")
time.sleep(interval)
p = os.popen(cmd_really, "r")
text = p.read()
sts = p.close()
if sts:
print("Exit code:", sts, file=sys.stderr)
sys.exit(sts)
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()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment