我正在为我的终端创建一些别名以输出不同的 IP 地址。其中三分之二工作得很好,但我的默认网关不会返回干净的响应。
alias inet="hostname -I | awk '{print $3}'"
Run Code Online (Sandbox Code Playgroud)
回报:192.168.xxx.xx
按预期
alias pubip="curl ifconfig.me"
Run Code Online (Sandbox Code Playgroud)
回报:354.xxx.xx.xx
按预期
但是我创建的别名是为了返回默认网关 ip
alias def="ip r | grep default | awk '{print $3}'"
Run Code Online (Sandbox Code Playgroud)
返回:default via 192.168.xxx.xxx dev eth0
我在终端中使用同一行,它只会按预期返回默认网关。
但是,当它存储为别名时,脚本的“awk”部分不起作用。
我不能在别名中使用两次管道吗?我的代码还有其他问题吗?
raj*_*raj 15
在别名定义中,$3
实际上是在定义别名时展开的(尽管乍一看并非如此)。如果您alias
在定义别名后键入(以查看定义的别名),您将看到您的别名实际上具有以下形式
alias def='ip r | grep default | awk '\''{print }'\'''
Run Code Online (Sandbox Code Playgroud)
并且由于print
单独 in awk
,因此打印了返回的整行grep
。
使用以下命令定义别名:
alias def="ip r | grep default | awk '{print \$3}'"
Run Code Online (Sandbox Code Playgroud)
那么你的别名将采用以下形式:
alias def='ip r | grep default | awk '\''{print $3}'\'''
Run Code Online (Sandbox Code Playgroud)
它会按照你想要的方式工作。