summaryrefslogtreecommitdiff
path: root/Lib/shlex.py
diff options
context:
space:
mode:
authorÉric Araujo <merwok@netwok.org>2011-07-27 18:29:31 +0200
committerÉric Araujo <merwok@netwok.org>2011-07-27 18:29:31 +0200
commit9bce311ea4f58ec04cab356a748e173ecfea381c (patch)
treefd767a62dab42bb79ce2e86a2ac6fb970930c10e /Lib/shlex.py
parentfcdaaa9011be28d4653dadc92df4a94b2f669711 (diff)
downloadcpython-git-9bce311ea4f58ec04cab356a748e173ecfea381c.tar.gz
Add shlex.quote function, to escape filenames and command lines (#9723).
This function used to live as pipes.quote, where it was undocumented but used anyway. (An alias still exists for backward compatibility.) The tests have been moved as is, but the code of the function was changed to use a regex instead of a loop with string comparisons (at Ian Bicking’s suggestion). I’m terrible at regexes, so any feedback is welcome.
Diffstat (limited to 'Lib/shlex.py')
-rw-r--r--Lib/shlex.py20
1 files changed, 18 insertions, 2 deletions
diff --git a/Lib/shlex.py b/Lib/shlex.py
index 3edd3db1ed..279ab48405 100644
--- a/Lib/shlex.py
+++ b/Lib/shlex.py
@@ -6,13 +6,14 @@
# Posix compliance, split(), string arguments, and
# iterator interface by Gustavo Niemeyer, April 2003.
-import os.path
+import os
+import re
import sys
from collections import deque
from io import StringIO
-__all__ = ["shlex", "split"]
+__all__ = ["shlex", "split", "quote"]
class shlex:
"A lexical analyzer class for simple shell-like syntaxes."
@@ -274,6 +275,21 @@ def split(s, comments=False, posix=True):
lex.commenters = ''
return list(lex)
+
+_find_unsafe = re.compile(r'[^\w\d@%_\-\+=:,\./]').search
+
+def quote(s):
+ """Return a shell-escaped version of the string *s*."""
+ if not s:
+ return "''"
+ if _find_unsafe(s) is None:
+ return s
+
+ # use single quotes, and put single quotes into double quotes
+ # the string $'b is then quoted as '$'"'"'b'
+ return "'" + s.replace("'", "'\"'\"'") + "'"
+
+
if __name__ == '__main__':
if len(sys.argv) == 1:
lexer = shlex()