从这问题,以下命令给出了系统的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
正在被扩展通过 shell在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