我在远程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中运行别名时遇到问题?
我有没有明显的理由可以解决这个问题而其他人不会这样做?
有人能指出我描述这个问题和解决方案的链接吗?并解释他们是如何找到他们的......:)
答案 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函数。我想你会发现在非交互式源代码中使用别名非常罕见,也许你应该重新考虑你的实现。