在Fabric脚本中调用bash别名

Job*_*Job 11 ubuntu alias fabric

我在~/.bash_aliases远程ubuntu服务器上的文件中有别名.该文件以标准方式从文件加载~/.bashrc,如下所示:

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi
Run Code Online (Sandbox Code Playgroud)

~/.bashrc文件依次从~/.profile文件加载(也以标准方式),如下所示:

if [ "$BASH" ]; then
  if [ -f ~/.bashrc ]; then
    source ~/.bashrc
    echo ".profile loaded .bashrc"
  fi
fi
mesg n
Run Code Online (Sandbox Code Playgroud)

我发现我的别名在我的结构命令中不可用,例如当我在结构脚本中执行此操作时:

run("aliased_command")
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

run: aliased_command
out: .profile loaded .bashrc
out: /bin/bash: aliased_command: command not found
Fatal error: run() encountered an error (return code 127) while executing 'aliased_command'
Run Code Online (Sandbox Code Playgroud)

现在,我设法通过使用ssh登录到服务器并在运行:

~# /bin/bash -l -c aliased_command 
Run Code Online (Sandbox Code Playgroud)

从shell(nb /bin/bash -l -c是结构的默认值,见这里)我得到相同的输出:

.profile loaded .bashrc:
/bin/bash: aliased_command: command not found
Run Code Online (Sandbox Code Playgroud)

在对相关主题进行了相当多的搜索后,我在某处读到了不为非交互式shell导出别名,然后我设法使用/bin/bash -l -c -i(-i将bash设置为交互模式)来修复此问题.

然后我将以下内容添加到fabfile.py中:

env.shell = "/bin/bash -l -c -i" 
Run Code Online (Sandbox Code Playgroud)

现在我可以在我的结构命令中使用别名......太棒了!


所以我的问题是:

  • 这个解决方案有什么问题吗?如果是这样,我该怎么办?

  • 有没有其他人在他们的fabfiles中运行别名有问题?

  • 我有没有明显的理由可能会遇到这个问题而其他人不会这样做?

  • 谁能指出我描述这个问题和解决方案的链接等?并解释他们是如何找到他们的...... :)

Job*_*Job 25

这是主要问题的快速答案,为了节省一些人阅读我的长问题,只需添加

env.shell = "/bin/bash -l -i -c" 
Run Code Online (Sandbox Code Playgroud)

到你的fabfile.py,你应该能够在你的Fabric命令中使用别名!


pyf*_*unc 5

是的,您完全正确,默认情况下,非交互式会话中的bash shell不会扩展别名.

请参见手册页中的别名部分:http://linux.die.net/man/1/bash

当shell不是交互式时,别名不会扩展,除非使用shopt设置expand_aliases shell选项(请参阅下面的SHELL BUILTIN命令下的shopt说明).

因此,为了在非交互式会话中发生这种情况,请将其包含在您的.profile.

shopt -s expand_aliases
Run Code Online (Sandbox Code Playgroud)

这将使非交互式会话和结构脚本中的别名可用,而无需借助交互式会话.