Как видно из этого вопроса, следующая команда дает 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
Как я могу заставить его создать тот же результат?
Проблема заключается в том, что (предназначенная 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
Проблема заключается в том, что (предназначенная 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