如何在 bashrc 中设置别名,以便可以使用简单的别名命令找到系统 IP?

如何在 bashrc 中设置别名,以便可以使用简单的别名命令找到系统 IP?

问题,以下命令给出了系统的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 

我怎样才能让它产生相同的输出?

答案1

问题是(故意的 awk变量)$NF正在被扩展通过 shellalias声明时,而不是在稍后调用时。因此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

相关内容