| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | # Module 'commands' | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Various tools for executing commands and looking at their output and status. | 
					
						
							| 
									
										
										
										
											1992-03-31 19:02:55 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # NB This only works (and is only relevant) for UNIX. | 
					
						
							| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Get 'ls -l' status for an object into a string | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | def getstatus(file): | 
					
						
							|  |  |  | 	return getoutput('ls -ld' + mkarg(file)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Get the output from a shell command into a string. | 
					
						
							|  |  |  | # The exit status is ignored; a trailing newline is stripped. | 
					
						
							| 
									
										
										
										
											1991-08-16 13:23:29 +00:00
										 |  |  | # Assume the command will work with '{ ... ; } 2>&1' around it.. | 
					
						
							| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | # | 
					
						
							|  |  |  | def getoutput(cmd): | 
					
						
							|  |  |  | 	return getstatusoutput(cmd)[1] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Ditto but preserving the exit status. | 
					
						
							|  |  |  | # Returns a pair (sts, output) | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | def getstatusoutput(cmd): | 
					
						
							| 
									
										
										
											
												* string.py: added rindex(), rfind(); changed index() to interpret
  negative start indices starting from the right.
* ftplib.py: debug() -> set_debuglevel(); change demo to use __init__().
* os.py: added execl, execlp, and execvp.
* lambda.py: removed (now that we have built-in map, reduce, bagof, lambda)
* test_b{1,2}.py, testall.out: added tests for bagof, lambda, map, reduce
* commands.py: use os, not posix
* test_grammar.py: make it easy to disable non-portable int overflow tests
* dis.py: don't abuse range()
											
										 
											1993-11-08 15:05:21 +00:00
										 |  |  | 	import os | 
					
						
							|  |  |  | 	pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r') | 
					
						
							| 
									
										
										
										
											1991-08-16 13:23:29 +00:00
										 |  |  | 	text = pipe.read() | 
					
						
							|  |  |  | 	sts = pipe.close() | 
					
						
							| 
									
										
										
										
											1992-01-01 19:35:13 +00:00
										 |  |  | 	if sts == None: sts = 0 | 
					
						
							|  |  |  | 	if text[-1:] == '\n': text = text[:-1] | 
					
						
							| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | 	return sts, text | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Make command argument from directory and pathname (prefix space, add quotes). | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | def mk2arg(head, x): | 
					
						
							| 
									
										
										
											
												* string.py: added rindex(), rfind(); changed index() to interpret
  negative start indices starting from the right.
* ftplib.py: debug() -> set_debuglevel(); change demo to use __init__().
* os.py: added execl, execlp, and execvp.
* lambda.py: removed (now that we have built-in map, reduce, bagof, lambda)
* test_b{1,2}.py, testall.out: added tests for bagof, lambda, map, reduce
* commands.py: use os, not posix
* test_grammar.py: make it easy to disable non-portable int overflow tests
* dis.py: don't abuse range()
											
										 
											1993-11-08 15:05:21 +00:00
										 |  |  | 	import os | 
					
						
							|  |  |  | 	return mkarg(os.path.join(head, x)) | 
					
						
							| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Make a shell command argument from a string. | 
					
						
							| 
									
										
										
										
											1995-01-04 19:20:00 +00:00
										 |  |  | # Return a string beginning with a space followed by a shell-quoted | 
					
						
							|  |  |  | # version of the argument. | 
					
						
							| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | # Two strategies: enclose in single quotes if it contains none; | 
					
						
							| 
									
										
										
										
											1991-08-16 13:23:29 +00:00
										 |  |  | # otherwise, enclose in double quotes and prefix quotable characters | 
					
						
							| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | # with backslash. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | def mkarg(x): | 
					
						
							|  |  |  | 	if '\'' not in x: | 
					
						
							|  |  |  | 		return ' \'' + x + '\'' | 
					
						
							|  |  |  | 	s = ' "' | 
					
						
							|  |  |  | 	for c in x: | 
					
						
							| 
									
										
										
										
											1992-07-13 14:28:59 +00:00
										 |  |  | 		if c in '\\$"`': | 
					
						
							| 
									
										
										
										
											1990-10-13 19:23:40 +00:00
										 |  |  | 			s = s + '\\' | 
					
						
							|  |  |  | 		s = s + c | 
					
						
							|  |  |  | 	s = s + '"' | 
					
						
							|  |  |  | 	return s |