Это - моя конфигурация псевдонима в 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'
файл конфигурации?
Там уже существует псевдоним для 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
по-видимому, не получены; я протестировал многократно, но мой вызов псевдонима не приводил ни к каким результатам в том режиме.
$ echo "echo 'I am bashrc'" >> ~/.bashrc
$ bash
I am bashrc
$ exit
$ bash --posix
bash-4.3$