我需要从python运行以下shell脚本:
AliasScript = "osascript -e 'tell application \"Finder\" to make alias at \
POSIX file \"" + dirAlbumName + "\" as alias to \
POSIX file \"" + dirName + "\" as alias'"
os.system(AliasScript + "&> /dev/null")
仅在dirAlbumName
和/或dirName
变量不包含任何元字符(或称为特殊字符?)的情况下,例如\
,{{1} }或'
。例如,如果"
= dirName
,我会收到语法错误。
如何对这些变量进行转义?我尝试根据从here读取的内容使用shlex,但无法正常工作。例如,我尝试了/\/\/\ !@#$%^&*()|?"'"" /\?\/
,但没有用。
编辑:
要清楚,此代码将在循环中用不同的shlex.quote(dirName)
和dirName
值运行数百次,所以我不能只是手动转义它们。
答案 0 :(得分:1)
您可以使用python字符串格式准确传递所需的内容,例如,您需要执行以下操作:
dirAlbumName=r"jim&bo"
dirName=r"jon smith"
AliasScriptTemplate = r"osascript -e 'tell application \"{0}\" to make alias at \
POSIX file \"{1}\" as alias to \
POSIX file \"{2}\" as alias'"
AliasScript = AliasScriptTemplate.format("Finder",dirAlbumName,dirName)
AliasScript += r'&> /dev/null'
os.system(AliasScript)
这里的关键是在字符串的前缀r
意味着python不会对字符串“做任何事情”,但要保持原样。更多详情,请点击https://www.linode.com/docs/development/python/string-manipulation-python-3/
请注意,python的子进程模块非常适合运行脚本,它将使您更好地控制自己的工作,包括将stderr和stdout重定向到文件/变量/,请参见此处的说明https://www.programcreek.com/python/example/94463/subprocess.run
答案 1 :(得分:0)
请考虑使用shlex.quote
模块来转义dirAlnumName
和dirName
。我不熟悉您使用的脚本语言,但是这就是这里发生的情况。
>>> import shlex
>>> dirname="""/\/\/\ !@#$%^&*()|?"'"" /\?\/"""
>>> print(shlex.quote(dirname))
'/\/\/\ !@#$%^&*()|?"'"'"'"" /\?\/'
>>> print (dirname)
/\/\/\ !@#$%^&*()|?"'"" /\?\/
>>>
这是一个实时示例
>>> fname = "\name"
>>> import os
>>> os.system("touch " +fname)
touch: missing file operand
Try 'touch --help' for more information.
sh: 2: ame: not found
32512
>>> import shlex
>>> os.system("touch " +shlex.quote(fname))
0
一种更安全的方法是使用subprocess
模块,并完全避免使用shell。例如。
>>> import subprocess
>>> subprocess.Popen(['touch', '\name'])
>>> _.wait()
0
答案 2 :(得分:0)
我已经复制了您的问题。我创建了一个名为“ $#$%@@”的文件夹。每当其中出现“#”时,您都需要传递转义字符。 例如:
/path/to/folder/$\#$%@@