别名配置未正确加载

别名配置未正确加载

这是我在 Ubuntu 16.04.2 LTS 中的别名配置

root@Ubuntu:/# cat /etc/.bash_aliases 
alias i='ifconfig | grep eth -A 1'
alias l='ls -lh'
root@Ubuntu:/# 

root@Ubuntu:/# cat /etc/bash.bashrc
### *output truncated* ###
if [ -f /etc/.bash_aliases ]; then
    . /etc/.bash_aliases
fi
root@Ubuntu:/# 

然而,当我测试它时,它只alias i='ifconfig | grep eth -A 1'按预期工作。

root@Ubuntu:/# i
eth0      Link encap:Ethernet  HWaddr AA:AA:AA:AA:AA:AA  
          inet addr:10.0.0.1  Bcast:10.0.0.255  Mask:255.255.255.0
root@Ubuntu:/# 

root@Ubuntu:/# alias i
alias i='ifconfig | grep eth -A 1'
root@Ubuntu:/# 

另一个别名alias l='ls -lh'未按预期工作。

root@Ubuntu:/# l
bin/   dev/  home/
root@Ubuntu:/# 

输出应该是这样的:

root@Ubuntu:/# ls -lh
total 80K
drwxr-xr-x   2 root root 4.0K Jul 21 14:37 bin
drwxr-xr-x   3 root root 4.0K Jul 21 14:52 boot
drwxr-xr-x  15 root root 3.8K Nov  3 12:22 dev
root@Ubuntu:/# 

事实证明,这l不符合我的别名配置。

root@Ubuntu:/# alias l
alias l='ls -CF'
root@Ubuntu:/# 

我猜alias l='ls -CF'一定是在其他地方配置的。

问题是如何找出alias l='ls -CF'配置文件的位置?

答案1

已经存在lin的别名.bashrc(事实上,它是在中定义的/etc/skel/.bashrc,并且在创建用户时被复制到用户的主目录中),这就是覆盖你的别名的原因:

$ grep '^alias l=' /etc/skel/.bashrc                                                                                                                                   
alias l='ls -CF'
$ grep '^alias l=' ~/.bashrc                                                                                                                                           
alias l='ls -CF'

然而,这并不是唯一起作用的力量。同样发生的是 bash具体顺序(并取决于启动时的模式 - 交互式、非交互式、远程 shell 等)。一般的想法是,它从 中定义的文件转到/etc/主目录中定义的文件,因此您的别名确实在bashsources时得到定义,但随后在sources 您的/etc/.bash_aliases时得到重新定义。bash~/.bashrc

这是一个演示:

$ # define alias in your file and let it source via /etc/bash.bashrc
$ echo "alias sayhi='echo hi'" | sudo tee -a /etc/.bash_aliases
[sudo] password for xieerqi: 
alias sayhi='echo hi'
$ echo "[ -f  /etc/.bash_aliases ] && source /etc/.bash_aliases" |          
> sudo tee -a /etc/bash.bashrc
[sudo] password for xieerqi: 
[ -f  /etc/.bash_aliases ] && source /etc/.bash_aliases
$ # start new interactive shell
$ bash
$ sayhi
hi
$ # Works, right ? now define same in ~/.bashrc
$ echo "alias sayhi='echo nope'" >> ~/.bashrc
$ # and start shell again, let all files source
$ bash
$ sayhi
nope

请注意bash --posix,即当 shell 处于 posix 模式时,~/.bashrc/etc/bash.bashrc显然没有来源;我测试了多次,但我的别名调用在该模式下没有产生任何结果。

$ echo "echo 'I am bashrc'" >> ~/.bashrc
$ bash
I am bashrc
$ exit
$ bash --posix
bash-4.3$ 

相关内容