]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Add -i option. Don't exit when the command fails. Redirect stderr to stdout.
authorGuido van Rossum <guido@python.org>
Mon, 12 Nov 2007 23:12:57 +0000 (23:12 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 12 Nov 2007 23:12:57 +0000 (23:12 +0000)
Demo/curses/repeat.py

index 10832397e691f52824d38a3c67b032832664a780..93372c5d9a0e9ba7701a21d0304ca29a87fd34fc 100755 (executable)
@@ -1,6 +1,6 @@
 #! /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()