A configuração do alias não está carregada corretamente

1

Esta é a configuração do meu alias no 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:/# 

No entanto, quando eu testo, apenas alias i='ifconfig | grep eth -A 1' está funcionando como esperado.

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:/# 

Outro apelido alias l='ls -lh' não funciona como esperado.

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

A saída deve ser assim:

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:/# 

Acontece que l não segue minha configuração de alias.

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

Eu acho que alias l='ls -CF' deve ser configurado em algum outro lugar.

A questão é como descobrir a localização do arquivo alias l='ls -CF' config?

    
por Charlotte Russell 03.11.2017 / 15:33

1 resposta

2

Já existe um alias para l in .bashrc (na verdade, ele é definido em /etc/skel/.bashrc e copiado para o diretório pessoal do usuário quando o usuário é criado) e é isso que está sobrescrevendo o seu:

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

No entanto, essa não é a única força em jogo aqui. O que também acontece é que bash fontes arquivos em ordem específica (e dependendo do modo em que foi iniciado - interativo, não interativo, shell remoto, etc.). A idéia geral é que ele vai de arquivos definidos em /etc/ para arquivos definidos em seu diretório inicial, portanto, seu alias é definido quando bash sources /etc/.bash_aliases , mas depois é redefinido quando bash sources seu ~/.bashrc .

Aqui está uma demonstração:

$ # 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

Observe que bash --posix , ou seja, quando o shell está no modo posix, aparentemente, ~/.bashrc e /etc/bash.bashrc não são originados; Eu testei várias vezes, mas a invocação do meu alias não produziu nenhum resultado nesse modo.

$ echo "echo 'I am bashrc'" >> ~/.bashrc
$ bash
I am bashrc
$ exit
$ bash --posix
bash-4.3$ 
    
por Sergiy Kolodyazhnyy 03.11.2017 / 21:56