所以我试图通过像这样的python构造脚本来自动化Arch Linux实例的设置:

from fabric.api import run, sudo

def server_setup_communityrepo():
    run('echo \'echo "[archlinuxfr]" >> /etc/pacman.conf\' | sudo -s')
    run('echo \'echo "Server = http://repo.archlinux.fr/$arch" >> /etc/pacman.conf\' | sudo -s')
    run('echo \'echo " " >> /etc/pacman.conf\' | sudo -s')
    sudo('pacman -Syy yaourt --noconfirm')

由于run()中的$符号,因此在第二个$arch调用上会出现问题。该结构函数在第2行中失败,因为后跟$的字符串被Fabric识别为配置变量。但我实际上希望将$ arch理解为

bash shell中的echo 'echo "Server = http://repo.archlinux.fr/$arch" >> /etc/pacman.conf'调用。

如何从这种结构怪癖中“逃脱”并将$ arch指定为要写入到pacman.conf文件中的文字?

最佳答案

使用带有单引号的echo。这样可以防止 shell 扩展$arch

run('echo \'Server = http://repo.archlinux.fr/$arch\' | sudo -s tee -a /etc/pacman.conf')

这应该等效于
echo 'Server = http://repo.archlinux.fr/$arch' | sudo -s tee -a /etc/pacman.conf

快速测试:
>>> import os
>>> os.system('echo \'Server = /foo/$arch\' ')
Server = /foo/$arch
0

关于python - 从python fabric执行远程bash命令时的"Escaping"$,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10202162/

10-12 17:52