2016-07-14 3 views
0
import sys 
from fabric.api import * 

env.hosts = ['my.host.com'] 
env.user = 'myuser' 
env.password = 'mypassword' 
# env.shell = '/bin/bash -l -c' 

def deploy(): 
    x = run("cd /srv/proj/") 
    print x.__dict__ 

Я пытаюсь войти в удаленную оболочку и выполнить эту простую команду cd. хотя он показывает, что не существует никакой ошибкиТкань сценарий не печатает вывод на успех

[my.host.com] run: cd /srv/proj/ 
{'succeeded': True, 'return_code': 0, 'failed': False, 'command': 'cd /srv/proj/', 'stderr': '', 'real_command': '/bin/bash -l -c "cd /srv/proj/"'} 

, но когда я исполню run('ls') после команды CD, он ничего не печатает, но определенно есть файлы. так что здесь происходит. кроме того, у меня возникают проблемы с выполнением команды ручного набора (я имею в виду псевдоним в файле .bashrc). ткань использует /bin/bash -l -c .... как я могу преодолеть это препятствие.

Я использую Ubuntu 14.04

пс: это не то же самое, как os.chdir

+1

Заменить 'Run (" CD/SRV/проектируемый/")' с 'os.chdir ("/srv/proj/")' или слить 2 команды как 'run (" cd/srv/proj /; ls ")' – anishsane

ответ

1

Вы могли бы, возможно, попробовать with cd:

def deploy(): 
    with cd("/srv/proj/"): 
     x = run("ls") 
    print(x) 
+0

отлично, это сработало, можете ли вы, пожалуйста, объяснить вещи что здесь происходит? зачем нам «с», тегом? – Wendy

+0

Для всех блоков 'with cd' вы находитесь в каталоге'/srv/proj/', поэтому каждая команда, которую вы запустите, будет выполнена там. Когда вы покинете блок, вы вернетесь в предыдущий каталог, из которого вы пришли. (Я не могу сказать вам, добавляет ли это 'cd/srv/proj /' перед командованием, потому что я не знаю, как он это делает.) – pwnsauce

+0

также, cd ничего не может вернуть (кроме кода исполнения), поэтому ' x = run (cd ..) 'не имеет большого смысла, кроме проверки, если он равен 0 или 1 – pwnsauce