这是我在 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
已经存在l
in的别名.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/
主目录中定义的文件,因此您的别名确实在bash
sources时得到定义,但随后在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$