调用bash的别名,在面料的脚本(Invoking bash aliases in Fabric s

2019-07-30 04:20发布

我有一个别名~/.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 

从shell(NB /bin/bash -l -c是面料的默认,见这里 ),我得到了相同的输出:

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

相关主题搜索的公平一点后,我某处读取别名不出口的非交互shell,然后我设法解决这个问题使用/bin/bash -l -c -i-i套庆典互动模式)。

然后添加以下到我的fabfile.py:

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

现在,我可以在我的布命令......好了使用别名!


所以我的问题是:

  • 是否有此解决方案的任何问题? 如果是这样,我应该怎么做?

  • 没有任何人在他们的fabfiles运行别名有问题吗?

  • 是否有任何明显的原因,我可能有这个问题,其他人就没有呢?

  • 任何人都可以点我描述这个问题和决议的链接等? 而且也解释了他们是如何发现他们...:)

Answer 1:

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

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

您fabfile.py,你应该在你的面料命令好了能够使用别名!



Answer 2:

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

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

当壳不是交互的,除非expand_aliases壳选择是使用设置命令shopt别名没有扩展的(见禁用了javascript的描述下SHELL BUILTIN以下命令)。

因此,为了让这对一个非交互式会话发生,包括这在你的.profile

shopt -s expand_aliases

这将使在非交互式会话中可用和别名你的面料脚本,而无需诉诸互动环节。



Answer 3:

我怀疑背后不是出口别名bash的行为的理由是,别名设计主要是为了提供交互的shell用户定义的快捷键快速或缩写的机制。 在你的脚本,你应该使用完整的命令(即ls -l ,而不是ll )的可读性。 不要让人们了解你所有的别名,以读取你的项目的源代码。 如果你的别名是真的那么重要,可以考虑让他们独立的shell脚本或者至少外壳的功能。 我想你会发现它非常罕见的在非交互式的源代码使用别名,也许你应该重新考虑您的实现。



文章来源: Invoking bash aliases in Fabric scripts