for loop output re direction failure

时间:2014-04-01 12:45:29

标签: bash for-loop

我为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

在重新指导循环输出时,有人可以帮助我纠正错误吗?

2 个答案:

答案 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>&1stderr重定向到stdout并将两者写入文件/tmp/logfile

awk -F: '/flags/ && $1 !~ /^lo/ {print $1}'

  1. -F:将字段分隔符设置为:
  2. /flags/ && $1 !~ /^lo/ {print $1}表示“如果该行包含flag且第一列未以字符串lo开头,则打印第一列(接口名称)
  3. while read if; do [...] done逐行循环遍历这些接口名称,并在每次迭代时将它们读入变量$if