Конфигурация псевдонима не загружается правильно

Это - моя конфигурация псевдонима в 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
задан 4 November 2017 в 04:47

1 ответ

Там уже существует псевдоним для 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$ 
2
ответ дан 7 December 2019 в 13:29

Другие вопросы по тегам:

Похожие вопросы: