Как установить псевдоним в bashrc, чтобы можно было найти системный IP-адрес с помощью простой команды alias?

Как видно из этого вопроса, следующая команда дает IP-адрес системы. ip route get 8.8.8.8 | awk '{print $NF; exit}'

Я хотел использовать эту команду для создания псевдонима, чтобы мне не приходилось вводить такую ​​длинную команду каждый раз. Итак, я добавил следующую строку в .bashrc

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

Но я столкнулся с проблемой с командой awk, когда я использую ее с псевдонимом (в частности, я думаю, что переменная $ NF не задан. Я предоставил три версии вывода, используя командную строку и заданный псевдоним для лучшего понимания.

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

Как я могу заставить его создать тот же результат?

0
задан 25 July 2017 в 08:14

2 ответа

Проблема заключается в том, что (предназначенная awk переменная) $NF расширяется оболочкой во время объявления alias, а не при вызове позже. Итак, alias в конечном итоге объявляется как:

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

, и это, очевидно, print.

Вам нужно предотвратить преждевременное расширение любым обычным механизмом экранирования, здесь я использую обратную косую черту - \:

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

$ ipconfig
192.168.2.6

Или если вы чувствуете себя выгодно, вы можете играть с предназначенными однократными кавычками:

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

$ ipconfig
192.168.2.6

Как побочная заметка, вы должны только alias при выполнении простых подстановок, для любых сложных случаев, вы должны действительно смотреть на использование функций, они более читабельны и надежны. Например, это можно было бы просто принять следующую форму (забыть о цитировании и других хаках):

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

$ ipconfig
192.168.2.6
5
ответ дан 22 May 2018 в 20:13

Проблема заключается в том, что (предназначенная awk переменная) $NF расширяется оболочкой во время объявления alias, а не при вызове позже. Итак, alias в конечном итоге объявляется как:

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

, и это, очевидно, print.

Вам нужно предотвратить преждевременное расширение любым обычным механизмом экранирования, здесь я использую обратную косую черту - \:

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

Или если вы чувствуете себя выгодно, вы можете играть с предназначенными однократными кавычками:

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

Как побочная заметка, вы должны только alias при выполнении простых подстановок, для любых сложных случаев, вы должны действительно смотреть на использование функций, они более читабельны и надежны. Например, это можно было бы просто принять следующую форму (забыть о цитировании и других хаках):

$ ipconfig() { ip route get 8.8.8.8 | awk '{print $NF}' ;} $ ipconfig 192.168.2.6
5
ответ дан 18 July 2018 в 09:44

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

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