0

是否有可能拥有一个仅保留先前run执行状态的上下文管理器。在代码中:

编辑:不是一个可行的解决方案,这是我所期望的

with sudo('. myapp'): #this runs a few things and sets many env variables
    run('echo $ENV1') # $ENV1 isn't set because the sudo command ran independently
    

我正在尝试运行多个命令,但想在每个命令之间保持状态?

我尝试使用前缀上下文管理器,但它不适用于 shell_env 上下文管理器:运行此代码时

with shell_env(ENV1="TEST"):
    with prefix(". myapp"):
          run("echo $ENV2")

我希望我ENV被设置然后运行我应该设置env2但前缀在 shell_env 之前运行的应用程序?

4

2 回答 2

1

不太明白这里问的问题。您能否详细说明您要完成的工作。但是,我尝试了与with sudo('. myapp)您所做的相同的事情(),这引发了AttributeError __exit__异常。

最后,我尝试使用前缀来获取 bash 文件并在此上下文中执行 sudo 命令行,效果很好。

@fab.task
def trythis():
    with fab.prefix('. testenv'):
        fab.sudo('echo $ENV1')

执行任务时,我得到以下输出。

[host] Executing task 'trythis'
[host] sudo: echo $ENV1
[host] out: sudo password: 

[host] out: testing
[host] out: 


Done.
Disconnecting from host... done.
于 2014-05-22T08:02:30.280 回答
0
with shell_env(ENV1="TEST"):
    with prefix(". myapp"):
          run("echo $ENV2")

我希望设置我的 ENV 然后运行我应该设置 env2 但前缀在 shell_env 之前运行的应用程序?

鉴于织物的文档,您编写的代码将生成:

export ENV1="TEST" && . myapp && echo $ENV2

鉴于myappcreate ENV2,您的代码应该按照您希望的方式工作,尽管并非所有 shell 都以相同的方式解释点运算符,但使用source总是一个更好的主意。

with shell_env(ENV1="TEST"):
    with prefix("source myapp"):
          run("echo $ENV2")

您可能会考虑一个错误myapp,和/或仔细检查所有路径和工作目录是否设置正确。

于 2014-05-22T08:35:03.707 回答