mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			80 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			80 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()
 | 
