alias ip="ifconfig eth0 | grep '255$' | awk '{print '\$2'}'"
alias
使用不带参数的命令然后我得到
alias ip='ifconfig eth0 | grep '\' '255$'\'' | awk '\''{print '\''$2'\''}'\'''
但是,如果我跑步ip
,我会得到
inet xxx.xxx.x.xxx netmask xxx.xxx.xxx.x broadcast xxx.xxx.x.xxx
当我运行时ifconfig eth0 | grep '255$' | awk '{print '\$2'}'
,我只能成功获取我的IP,就像xxx.xxx.x.xxx
。
我对这种状况感到困惑。你可以帮帮我吗?
答案1
经过所有那些引用地狱,你最终运行的是awk '{print }'
。这是因为在别名分配中\$2
是在双引号字符串中,其中反斜杠阻止扩展$2
,但是当使用别名时,$2
将不加引号并扩展为当前位置参数的任何内容$2
,在交互式 shell 中可能为空。不带任何参数的命令print
打印整个输入行。
最容易看到的是set -x
:
$ set -x
$ ip
+ grep '255$'
+ /sbin/ifconfig eth0
+ awk '{print }'
inet ... netmask 255.0.0.0 broadcast 10.255.255.255
(而且我在该接口上的网络掩码似乎错误。)
使用函数可以更轻松地完成类似的事情,因为这样您就不需要引用整个命令:
myip() {
ifconfig eth0 | grep '255$' | awk '{print $2}'
}
然而,awk
可以做 grep 所做的事情,我们可能不应该匹配255
但也许inet
关键字,所以:
myip() {
ifconfig eth0 | awk '/inet/ {print $2}'
}
或者更明确一点:
myip() {
ifconfig eth0 | awk '$1 == "inet" {print $2}'
}
这也避免了/inet/
匹配也可以匹配该inet6
行。
请注意,这ip
是另一个实用程序。
答案2
我刚刚在我的电脑上复制了它,你可以试试吗
alias ip="ifconfig eth0 | grep '255$' | awk '{print \$2}'"
这对我有用。
确保source .bashrc
更新后