我为soalris操作系统创建了一个小脚本,它将检查哪个以太网卡受DHCP控制,如下所示:
for i in `/usr/sbin/ifconfig -a | awk '/flags/ {print $1}' | grep -v lo | sed 's/://g'`
do
echo `ifconfig $i dhcp status`
done >> /tmp/logfile
但这只是在/ tmp创建一个日志文件,但没有将stdout写入它。只有stdout显示在promt上,如下所示:
ifconfig: e1000g1: interface is not under DHCP control
ifconfig: e1000g1: interface is not under DHCP control
在重新指导循环输出时,有人可以帮助我纠正错误吗?
答案 0 :(得分:3)
该输出将stderr
转到stdout
,因此您需要执行2>>
重定向。
稍微简化的命令:
ifconfig -a | sed -n '/flags/!d;/lo/d;s/:.*//g;p' | \
xargs -n 1 I{} ifconfig {} dhcp status 2>> /tmp/logfile
答案 1 :(得分:0)
您正在将stdout
重定向到/tmp/logfile
,并且您看到的邮件会打印到您未重定向的stderr
。
{
ifconfig -a | awk -F: '/flags/&&$1!~/^lo/{print $1}' | while read if; do
ifconfig "${if}" dhcp status
done
} >/tmp/logfile 2>&1
这会将所有输出重定向到/tmp/logfile
,包括stderr
。
括号{ ... }
允许group commands,以便我们可以立即将整个代码段的输出重定向到内部。
>/tmp/logfile 2>&1
将stderr
重定向到stdout
并将两者写入文件/tmp/logfile
。
awk -F: '/flags/ && $1 !~ /^lo/ {print $1}'
:
-F:
将字段分隔符设置为:
/flags/ && $1 !~ /^lo/ {print $1}
表示“如果该行包含flag
且第一列未以字符串lo
开头,则打印第一列(接口名称) while read if; do [...] done
逐行循环遍历这些接口名称,并在每次迭代时将它们读入变量$if
。