2016-08-18 29 views
1

在shell脚本中,我运行一个可能失败的命令。例如,在这里我工作在一个新的目录(mkdir foo && cd foo),所以make命令不能成功。在shell中处理错误并重定向输出

我处理错误与||

make || echo "No target" 

...我打印输出的日志文件与tee(stdout和stderr):

make 2>&1 | tee foo.log 

怎么办两个一次?

  • make 2>&1 | tee foo.log || echo "No target":将错误写入日志文件,但不要在控制台中打印“无目标”;
  • make || echo "No target" 2>&1 | tee foo.log:在控制台中输出错误和“No target”,但在日志文件中只写入“No target”,而不是错误本身。
+0

实际上,如果'cd'失败,你就不应该运行'make',而不是简单地检查'make'是否失败。 'mkdir foo && cd foo || {echo“can not cd foo”;出口1; }'。 – chepner

回答

1

如果你正在使用bash,您可以检查PIPE_STATUS[0]获得在make 2>&1 | teemake的状态。如果你想可移植性,你可以这样做:

{ make 2>&1 || echo 'No target' > /dev/tty; } 2>&1 | tee foo.log 

但“没有目标”很可能是错误的错误信息,而这只会混淆人谁遇到它。

如果你想“没有目标”是在foo.log为好,使用方法:

{ make 2>&1 || echo 'No target'; } | tee foo.log 

但重申:“没有目标”是一个无用的错误消息,这可能是不准确的。

+0

谢谢!当然这是一个例子,我不想只打印“没有目标”。 – roipoussiere