这很好用
@task
def foo(context):
with context.cd('/'):
context.run('pwd')
输出:
/
但这不是:
@task
def bar(context):
with context.cd('/'):
context.sudo('pwd', password='mysecretpassword')
输出:
[sudo] password: sudo: cd: Befehl nicht gefunden
如何运行第二个示例?
答案 0 :(得分:2)
事实证明,这是一个尚未修复的调用错误。
https://github.com/pyinvoke/invoke/issues/459
编辑:
这是我现在的解决方法:
context.sudo('bash -c cd“/&& pwd”')
答案 1 :(得分:0)
扩展@mogoh的回答。
正确的方法是将整个命令包含在双引号中,如下所示:
context.sudo('bash -c "cd /some/path && ls"')
由于命令可能会变得越来越大并遵循DRY原理,因此我创建了一个函数来对此进行包装:
def sudo_cd(context, path, command):
"""Workaround on the problem of cd not working with sudo command"""
context.sudo(f'bash -c "cd {path} && {command}"')
在上面的示例中,我们像这样使用它:
sudo_cd(context, '/some/path', 'ls')