我正在尝试在远程服务器上运行某些命令。我需要在那里获取一些bash文件。不幸的是,似乎结构(突然,最近?)开始使用/bin/sh
,并且它因我在脚本中使用bash语法而中断。我找到了this:
如果shell为True(默认值),run将通过shell解释器执行给定的命令字符串,其值可以通过设置env.shell来控制(默认为类似于/ bin / bash -l -c) “”。)当shell为True时,命令中的任何双引号(“)或美元符号($)字符将自动转义。
我没有更改env.shell,所以我不知道为什么Fabric开始使用sh
。在任何情况下,我都会覆盖它,但仍然没有运气:
env.shell = "/bin/bash"
可能导致这种情况的原因是什么?我该怎样做才能强制结构使用bash
?
答案 0 :(得分:5)
需要一些挖掘,但这是我发现的:
可以看到幕后正在做什么面料:
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
的结构,但是,因为我(在这种特殊情况下)运行本地命令,罪魁祸首是subprocess模块。要指定要使用的shell,您需要指定shell=True
和executable='/bin/bash'