The environment for any simple command or function may be augmented temporarily by prefixing it with parameter assignments, as described in Shell Parameters. These assignment statements affect only the environment seen by that command.
import os
# Get the (unqualified) names of all the entries with the desired name
files = [f for f in os.listdir('/etc/squid') if f.endswith('.conf')]
# Run w/o shell=True, in list form, letting Python handle the working directory
# and variable formatting
subprocess.Popen(['sed', '-i', 's/{}/{}/g'.format(old_val, new_val)] + files, cwd='/etc/squid')
事实上,我找到了一些有用的方法,将每个变量放在单引号中,然后对单引号进行转义。在
你的问题是:
依赖于shell来扩展变量,而不是
sed
。但是通过命令前缀设置变量只会影响命令的环境,而不是bash,因此old_val
是从不为字符串插值而定义的。根据bash reference manual(加上强调):因此,如果
sed
试图从自己的环境中读取old_val
,它将看到正确的值。但是sed
接收的是传递的后插值字符串,它是s//9/g
,因为bash插值没有看到old_val
(它只存在于sed
)。在要修复此问题,请在bash中设置变量,方法是将赋值作为单独的命令执行,而不是
^{pr2}$sed
前缀:或者更准确地说,您应该真正避免依赖
shell=True
(这很危险/很容易被滥用)。即使必须使用sed
,也可以在Python层完成使用shell的所有工作:这有相同的行为(在
/etc/squid
中操作,并传递不合格的文件名,这样如果在深度嵌套的目录中有很多文件,就不会出现新的命令行长度问题)。在当然,您可以更进一步,只需在Python中使用the ^{} module 来完成
sed
的工作;它的特点是像sed
一样就地编辑文件(尽管如果文件的大小有意义,它可能会稍微慢一点)。在更改为:
变量赋值需要是
sed
的独立语句。当您在语句的开头放置变量赋值时,它只设置一个由子进程继承的环境变量。但是需要原始shell扩展变量,因此需要在执行sed
命令之前设置变量。在相关问题 更多 >
编程相关推荐