Tôi nghĩ giải pháp dựa trên prefix
của bạn là hoàn toàn hợp lệ. Tuy nhiên, nếu bạn muốn có một người quản lý shell_env
bối cảnh là một đề xuất trong issue#263, bạn có thể sử dụng việc thực hiện thay thế sau trong file fab của bạn:
from fabric.api import run, env, prefix
from contextlib import contextmanager
@contextmanager
def shell_env(**env_vars):
orig_shell = env['shell']
env_vars_str = ' '.join('{0}={1}'.format(key, value)
for key, value in env_vars.items())
env['shell']='{0} {1}'.format(env_vars_str, orig_shell)
yield
env['shell']= orig_shell
def my_task():
with prefix('echo FOO1=$FOO1, FOO2=$FOO2, FOO3=$FOO3'):
with shell_env(FOO1='BAR1', FOO2='BAR2', FOO3='BAR3'):
run('env | grep BAR')
Lưu ý rằng quản lý bối cảnh này sẽ thay đổi env['shell']
thay vì env['command_prefixes']
(như prefix
quản lý bối cảnh thực hiện), vì vậy bạn:
- vẫn có thể sử dụng
prefix
(xem ra ví dụ dưới đây) mà không có vấn đề tương tác nêu tại issue#263.
- phải áp dụng bất kỳ thay đổi nào cho
env['shell']
trước khi sử dụng shell_env
. Nếu không, các thay đổi shell_env
sẽ bị ghi đè và các biến môi trường sẽ không khả dụng cho các lệnh của bạn.
Khi thực hiện các tập tin fab ở trên, bạn sẽ có được kết quả như sau:
$ fab -H localhost my_task
[localhost] Executing task 'my_task'
[localhost] run: env | grep BAR
[localhost] out: FOO1=BAR1, FOO2=BAR2, FOO3=BAR3
[localhost] out: FOO1=BAR1
[localhost] out: FOO2=BAR2
[localhost] out: FOO3=BAR3
[localhost] out:
Done.
Disconnecting from localhost... done.
Nhưng các biến sẽ tồn tại sau khi vải đóng kết nối? Từ tài liệu ('prefix' và' shell_env') tôi hiểu rằng các biến môi trường sẽ được thiết lập chỉ cho các lệnh được bọc. – glarrain