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

Nav*_*nis 0 bash alias bashrc ip awk

这个问题可以看出,以下命令给出了系统的 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}'"
Run Code Online (Sandbox Code Playgroud)

但是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 
Run Code Online (Sandbox Code Playgroud)

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

hee*_*ayl 5

问题是 (预期 awk变量)在声明时被 shell$NF扩展,而不是在稍后调用时。因此,最终被声明为:aliasalias

alias ipconfig="ip route get 8.8.8.8 | awk '{print}'"
Run Code Online (Sandbox Code Playgroud)

print显然将整个记录。


您需要通过任何常用的转义机制来防止过早扩展,这里我使用的是反斜杠 -- \

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

$ ipconfig
192.168.2.6
Run Code Online (Sandbox Code Playgroud)

或者,如果您觉得有利,您可以使用丑陋的单引号技巧:

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

$ ipconfig
192.168.2.6
Run Code Online (Sandbox Code Playgroud)

作为旁注,您应该只alias在进行简单的替换时,对于任何复杂的情况,您应该真正考虑利用函数,它们的可读性和可靠性要高得多。例如,这个可以简单地采用以下形式(忘记引用和其他技巧):

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

$ ipconfig
192.168.2.6
Run Code Online (Sandbox Code Playgroud)