11

我在~/.bash_aliases远程 ubuntu 服务器上的文件中有别名。该文件以标准方式从文件中加载~/.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 

从外壳(nb/bin/bash -l -c是织物的默认值,请参见此处)我得到相同的输出:

.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" 

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


所以我的问题是:

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

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

  • 有什么明显的原因可以解释为什么我可能会遇到这个问题而其他人不会?

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

4

3 回答 3

25

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

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

到您的 fabfile.py ,您应该能够在您的结构命令中使用别名,非常棒!

于 2012-06-30T07:51:57.763 回答
5

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

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

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

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

shopt -s expand_aliases

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

于 2012-06-30T07:58:54.607 回答
2

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

于 2012-07-09T13:45:02.237 回答