5

我正在尝试在远程服务器上运行一些命令。我需要在那里获取一些 bash 文件。不幸的是,fabric 似乎(突然,最近?)开始使用/bin/sh,并且由于我在脚本中使用 bash 语法而中断。我发现了这个

如果 shell 为 True(默认),run 将通过 shell 解释器执行给定的命令字符串,其值可以通过设置 env.shell 来控制(默认类似于 /bin/bash -l -c ""。 ) 当 shell 为 True 时,命令中的任何双引号 (") 或美元符号 ($) 字符都将被自动转义。

我没有更改 env.shell,所以我不知道为什么 fabric 开始使用sh. 无论如何,我正在覆盖它,但仍然没有运气:

env.shell = "/bin/bash"

这可能是什么原因造成的?我能做些什么来强制使用面料bash

4

1 回答 1

5

它需要一些挖掘,但这是我发现的:

可以看到 Fabric 在幕后做了什么:

from   fabric.api                                        import output

FAB_SHOW_RUNNING  = True   # Show the command that fabric runs
FAB_SHOW_STDOUT   = False  # Show the stdout of the command run
FAB_SHOW_STDERR   = False  # Show the stderr of the command run
FAB_SHOW_DEBUG    = True   # Increase logging detail for messages
FAB_SHOW_USER     = True
FAB_SHOW_STATUS   = False  # Prevent fabric from using print in some situations (at least in disconnect_all)
FAB_SHOW_WARNINGS = False  # Avoid fabric from showing messages about failed commands

output['running']  = FAB_SHOW_RUNNING
output['stdout']   = FAB_SHOW_STDOUT
output['stderr']   = FAB_SHOW_STDERR
output['debug']    = FAB_SHOW_DEBUG
output['user']     = FAB_SHOW_USER
output['status']   = FAB_SHOW_STATUS
output['warnings'] = FAB_SHOW_WARNINGS

事实证明,它不是使用织物,/bin/sh但由于我(在这种特殊情况下)运行本地命令,罪魁祸首是子进程模块。为了指定要使用的外壳,您需要指定shell=Trueexecutable='/bin/bash'

于 2013-06-06T13:21:19.370 回答