在Fabric脚本中调用bash别名

时间:2012-06-30 07:37:55

标签: ubuntu alias fabric

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

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

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

if [ "$BASH" ]; then
  if [ -f ~/.bashrc ]; then
    source ~/.bashrc
    echo ".profile loaded .bashrc"
  fi
fi
mesg n

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

run("aliased_command")

我得到了这个输出:

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'

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

来重现这种结构
~# /bin/bash -l -c aliased_command 
来自shell的

(n.b。/bin/bash -l -c是结构的默认值,请参阅here)我得到相同的输出:

.profile loaded .bashrc:
/bin/bash: aliased_command: command not found

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

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

env.shell = "/bin/bash -l -c -i" 

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


所以我的问题是:

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

  • 是否有其他人在其fabfiles中运行别名时遇到问题?

  • 我有没有明显的理由可以解决这个问题而其他人不会这样做?

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

3 个答案:

答案 0 :(得分:24)

这是主要问题的快速答案,拯救有人阅读我的长期问题,只是 添加

env.shell = "/bin/bash -l -i -c" 

到您的fabfile.py并且您应该能够在Fabric命令中使用别名!

答案 1 :(得分:5)

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

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

  

当shell不是交互式时,不会扩展别名,除非   expand_aliases shell选项是使用shopt设置的(参见描述   在SHELL BUILTIN COMMANDS下的shopt。)

因此,要在非交互式会话中进行此操作,请在.profile中加入此内容。

shopt -s expand_aliases

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

答案 2 :(得分:2)

我怀疑bash不导出别名的行为背后的原因是,别名的设计主要是为交互式shell用户提供定义快捷方式或缩写的机制。在脚本中,您应该使用完整命令(即ls -l而不是ll)以提高可读性。不要让人们学习你所有的别名,以便阅读你的项目的来源。如果您的别名非常重要,请考虑将它们作为独立的shell脚本或至少是shell函数。我想你会发现在非交互式源代码中使用别名非常罕见,也许你应该重新考虑你的实现。