为什么使用 awk 的这个别名没有像我的其他两个一样返回干净的响应?

为什么使用 awk 的这个别名没有像我的其他两个一样返回干净的响应?

我正在为我的终端创建一些别名,以输出不同的 IP 地址。其中两个工作正常,但我的默认网关别名不会返回干净的响应。

alias inet="hostname -I | awk '{print $3}'" 

返回:192.168.xxx.xx按预期

alias pubip="curl ifconfig.me"

返回:354.xxx.xx.xx按预期

但是我创建的别名返回的是默认网关 IP

alias def="ip r | grep default | awk '{print $3}'"

返回:default via 192.168.xxx.xxx dev eth0

我在终端中使用相同的行,它将按预期返回默认网关。

但是当它被存储为别名时,脚本的“awk”部分不起作用。

我不能在别名中两次使用管道吗?我的代码中还有其他问题吗?

答案1

在别名定义中,$3在定义别名时实际上会展开(尽管乍一看似乎并非如此)。如果您alias在定义别名后键入(以查看已定义的别名),您将看到您的别名实际上具有以下形式

alias def='ip r | grep default | awk '\''{print }'\'''

并且由于print中只有,因此将打印awk返回的整行。grep

使用以下内容定义别名:

alias def="ip r | grep default | awk '{print \$3}'"

那么你的别名将具有以下形式:

alias def='ip r | grep default | awk '\''{print $3}'\'''

它就会按照你想要的方式工作。

相关内容