Это моя конфигурация псевдонимов в 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 не следует за моим псевдонимом config.
root@Ubuntu:/# alias l
alias l='ls -CF'
root@Ubuntu:/#
Я думаю, alias l='ls -CF' должен быть настроен где-то в другом месте.
Вопрос в том, как узнать расположение конфигурационного файла alias l='ls -CF'?
Уже существует псевдоним для l в .bashrc (на самом деле он определен в /etc/skel/.bashrc и копируется в домашний каталог пользователя при создании пользователя), и это то, что перезаписывает ваш:
$ grep '^alias l=' /etc/skel/.bashrc
alias l='ls -CF'
$ grep '^alias l=' ~/.bashrc
alias l='ls -CF'
Однако, это не единственная сила, которая здесь играет. Также случается, что bash отправляет файлы в определенном порядке (и в зависимости от режима, в котором он был запущен - интерактивный, неинтерактивный, удаленная оболочка и т. Д.). Общая идея состоит в том, что он идет из файлов, определенных в /etc/, в файлы, определенные в вашем домашнем каталоге, поэтому ваш псевдоним действительно определяется в bash источниках /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, т.е. когда оболочка находится в режиме posix, ~/.bashrc и /etc/bash.bashrc, очевидно, aren 's sourced; Я тестировал несколько раз, но мой вызов псевдонима не дал никаких результатов в этом режиме.
$ echo "echo 'I am bashrc'" >> ~/.bashrc
$ bash
I am bashrc
$ exit
$ bash --posix
bash-4.3$
Уже существует псевдоним для l в .bashrc (на самом деле он определен в /etc/skel/.bashrc и копируется в домашний каталог пользователя при создании пользователя), и это то, что перезаписывает ваш:
$ grep '^alias l=' /etc/skel/.bashrc
alias l='ls -CF'
$ grep '^alias l=' ~/.bashrc
alias l='ls -CF'
Однако, это не единственная сила, которая здесь играет. Также случается, что bash отправляет файлы в определенном порядке (и в зависимости от режима, в котором он был запущен - интерактивный, неинтерактивный, удаленная оболочка и т. Д.). Общая идея состоит в том, что он идет из файлов, определенных в /etc/, в файлы, определенные в вашем домашнем каталоге, поэтому ваш псевдоним действительно определяется в bash источниках /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, т.е. когда оболочка находится в режиме posix, ~/.bashrc и /etc/bash.bashrc, очевидно, aren 's sourced; Я тестировал несколько раз, но мой вызов псевдонима не дал никаких результатов в этом режиме.
$ echo "echo 'I am bashrc'" >> ~/.bashrc
$ bash
I am bashrc
$ exit
$ bash --posix
bash-4.3$