2012-04-18 2 views
4

그래서 나는이 같은 파이썬 직물 스크립트를 통해 아치 리눅스 인스턴스의 설정까지 자동화하기 위해 노력하고 있습니다 :

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에서 실패합니다. 하지만 실제로는 $ arch가 리터럴로 이해되기를 바스 셸에서

echo 'echo "Server = http://repo.archlinux.fr/$arch" >> /etc/pacman.conf'으로 호출하고 싶습니다.

이 직물에서 "탈출"하고 pacman.conf 파일에 쓰여지는 리터럴로 $ arch를 지정하려면 어떻게해야합니까?

+0

은'\ $'업무로 변경합니까? – sarnold

+0

nope. 그게 제가 시도한 첫 번째 것입니다. 작동하지 않습니다. –

답변

4

작은 따옴표가있는 echo를 사용하십시오. 그러면 셸이 $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 
+0

죄송합니다. 잠깐. 문제가있는 것 같습니다. –

+0

불행하게도,이 echo는 bash 쉘에 파이프되어 있기 때문에 이것은 작동하지 않습니다. –

+1

리디렉션 대신 tee를 사용하도록 명령을 수정했습니다. 지금 작동합니까? – c00kiemon5ter

관련 문제