blob: d8c6e6542d5cd118c7e79b883907ac7c7f9b1ec9 [file] [log] [blame]
Guido van Rossumc6360141990-10-13 19:23:40 +00001# Module 'commands'
2#
3# Various tools for executing commands and looking at their output and status.
Guido van Rossume58f98b1992-03-31 19:02:55 +00004#
5# NB This only works (and is only relevant) for UNIX.
Guido van Rossumc6360141990-10-13 19:23:40 +00006
Guido van Rossumc6360141990-10-13 19:23:40 +00007
8# Get 'ls -l' status for an object into a string
9#
10def getstatus(file):
11 return getoutput('ls -ld' + mkarg(file))
12
13
14# Get the output from a shell command into a string.
15# The exit status is ignored; a trailing newline is stripped.
Guido van Rossum48154be1991-08-16 13:23:29 +000016# Assume the command will work with '{ ... ; } 2>&1' around it..
Guido van Rossumc6360141990-10-13 19:23:40 +000017#
18def getoutput(cmd):
19 return getstatusoutput(cmd)[1]
20
21
22# Ditto but preserving the exit status.
23# Returns a pair (sts, output)
24#
25def getstatusoutput(cmd):
Guido van Rossum48154be1991-08-16 13:23:29 +000026 import posix
27 pipe = posix.popen('{ ' + cmd + '; } 2>&1', 'r')
28 text = pipe.read()
29 sts = pipe.close()
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000030 if sts == None: sts = 0
31 if text[-1:] == '\n': text = text[:-1]
Guido van Rossumc6360141990-10-13 19:23:40 +000032 return sts, text
33
34
Guido van Rossumc6360141990-10-13 19:23:40 +000035# Make command argument from directory and pathname (prefix space, add quotes).
36#
37def mk2arg(head, x):
Guido van Rossume58f98b1992-03-31 19:02:55 +000038 import posixpath
39 return mkarg(posixpath.join(head, x))
Guido van Rossumc6360141990-10-13 19:23:40 +000040
41
42# Make a shell command argument from a string.
43# Two strategies: enclose in single quotes if it contains none;
Guido van Rossum48154be1991-08-16 13:23:29 +000044# otherwise, enclose in double quotes and prefix quotable characters
Guido van Rossumc6360141990-10-13 19:23:40 +000045# with backslash.
46#
47def mkarg(x):
48 if '\'' not in x:
49 return ' \'' + x + '\''
50 s = ' "'
51 for c in x:
Guido van Rossum01ca3361992-07-13 14:28:59 +000052 if c in '\\$"`':
Guido van Rossumc6360141990-10-13 19:23:40 +000053 s = s + '\\'
54 s = s + c
55 s = s + '"'
56 return s