Como definir um alias no bashrc para que o IP do sistema possa ser encontrado usando um simples comando alias?

0

Como visto em esta questão , o seguinte comando fornece o endereço IP do sistema. ip route get 8.8.8.8 | awk '{print $NF; exit}'

Eu queria usar esse comando para criar um alias para que eu não precisasse digitar um comando tão longo toda vez. Então, eu adicionei a seguinte linha em .bashrc

alias ipconfig="ip route get 8.8.8.8 | awk '{print $NF; exit}'"

Mas estou enfrentando um problema com o comando awk quando eu o uso com o alias (especificamente, acho que a variável $ NF não está definida. Forneci três versões da saída usando a linha de comando e o alias definido para melhor compreensão.

dennis@dennis-HP:~$ ip route get 8.8.8.8 | awk '{print $NF; exit}'
192.168.0.X 

dennis@dennis-HP:~$ ipconfig
8.8.8.8 via 192.168.0.Y dev wlx9d5d8eae8f64  src 192.168.0.X

dennis@dennis-HP:~$ ip route get 8.8.8.8
8.8.8.8 via 192.168.0.Y dev wlx9d5d8eae8f64  src 192.168.0.X 
    cache 

Como posso fazer com que ele produza o mesmo resultado?

    
por Naveen Dennis 25.07.2017 / 07:00

1 resposta

5

O problema é que a ( intenção awk variable) $NF está sendo expandida pelo shell em alias tempo de declaração, não quando chamado posteriormente. Então, o alias está sendo eventualmente declarado como:

alias ipconfig="ip route get 8.8.8.8 | awk '{print}'"

e isso vai print o registro inteiro, obviamente.

Você precisa evitar a expansão prematura por qualquer mecanismo de escape usual, aqui estou usando a barra invertida - \ :

$ alias ipconfig="ip route get 8.8.8.8 | awk '{print \$NF}'"

$ ipconfig
192.168.2.6

Ou, se você se sentir vantajoso, poderá jogar com os hacks de citação simples feios :

$ alias ipconfig='ip route get 8.8.8.8 | awk '\''{print $NF}'\'''

$ ipconfig
192.168.2.6

Como uma nota lateral, você deve apenas alias ao fazer substituições simples, para casos complexos, você deve realmente olhar para alavancar funções, elas são muito mais legíveis e confiáveis. Por exemplo, este pode simplesmente ter o seguinte formato (esqueça as citações e outros hacks):

$ ipconfig() { ip route get 8.8.8.8 | awk '{print $NF}' ;}

$ ipconfig
192.168.2.6
    
por heemayl 25.07.2017 / 07:18