使用Fabric 1.6.0设置$PATH变量

4

我正在尝试在远程服务器上运行一个已安装在我的主目录中的命令。该命令已经添加到了我的.bash_profile的$PATH中。当通过正常的ssh会话远程登录时,我能够使用它,但是Fabric似乎没有引入我的$PATH。因此,我尝试使用Fabric的path上下文管理器将其添加到我的$PATH中,如下所示:

def test_path():
    print('My env.path setting: %(path)s' % env)
    with path('/path/to/sources/drush'):
        run('echo $PATH')
        run('drush')

Fabric的响应如下:

Executing task 'test_path'
My env.path setting:
run: echo $PATH
out: /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
out:

run: echo $PATH
out: /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/path/to/sources/drush
out:

run: drush
out: /bin/bash: drush: command not found
out:

Fatal error: run() received nonzero return code 127 while executing!

Requested: drush
Executed: /bin/bash -l -c "export PATH=\"\$PATH:\"/path/to/sources/drush\" \" && drush"

Aborting.

Thanks for looking...


当您实际登录到远程服务器时,您的PATH设置是什么? - isedev
你的 env.path 里有什么东西吗? - alecxe
@isedev 当通过普通的ssh会话登录时,这是我的路径/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/path/to/sources/drush - user981023
@AlexanderAfanasiev 我在env.path中没有明确设置任何东西。我已经更新了原始帖子并添加了以下打印语句:print('My env.path setting: %(path)s' % env),这表明env.path为空。 - user981023
1个回答

2
问题出在PATH变量的设置方式上——末尾多了一个空格字符:
/bin/bash -l -c "export PATH=\"\$PATH:\"/path/to/sources/drush\" \" && drush"
                                                                ^HERE

搜索路径中的最后一个目录被解释为“/path/to/source/drush ”(末尾带空格)- 一个无效的目录。

我该如何防止它添加空格?在with语句中,“drush”和我的引号字符之间没有空格。 - user981023
Fabric的path上下文管理器的源代码包含以下注释:“在包装块内对runsudo的任何调用都将在给定命令之前隐式添加类似于“PATH=$PATH:<path>”的字符串。”因此,这种行为似乎是有意设计的。您应该联系开发人员并报告此问题,了解他们为什么这样做以及它是错误还是特性。这是邮件列表 - isedev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接