Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如何保存日志并在线查看?_Shell_Makefile - Fatal编程技术网

Shell 如何保存日志并在线查看?

Shell 如何保存日志并在线查看?,shell,makefile,Shell,Makefile,我想重定向make的日志,看看make在做什么。这是剧本 make |& tee make.log # bash syntax # make 2>&1 | tee make.log # or, sh syntax [ $? -ne 0 ] && echo "Error: stopped" && exit 1 echo "Done" 我发现当make失败时,它不会执行错误退出。 我猜这是由管道引起的,但是如何优化构建脚本呢

我想重定向make的日志,看看make在做什么。这是剧本

make |& tee make.log         # bash syntax
# make 2>&1 | tee make.log   # or, sh syntax
[ $? -ne 0 ] && echo "Error: stopped" && exit 1
echo "Done"
我发现当make失败时,它不会执行错误退出。
我猜这是由管道引起的,但是如何优化构建脚本呢?

既然您已经限制自己使用bash,而不是portable POSIX sh,那么您可以使用bash的pipefail shell选项;运行
设置-o pipefail
。bash的手册页上说:

如果启用了pipefail,则管道的返回状态为最后一个(最右边)要退出的命令的值,状态为非零,如果所有命令都成功退出,则返回状态为零

例如


谢谢,您也知道如何在sh中执行吗?在POSIX sh中没有直接的方法。您可以通过文件重定向输出,而不是使用效率低得多但允许您测试每个出口代码的管道。或者您可以将退出代码写入文件:
(firstcmd;echo$?>exitstatus)| secondcmd
,然后读取该文件。或者你可以用FD复制和重定向做一些超级花哨的事情;例如,见。
#!/bin/bash
set -o pipefail
if make |& tee make.log ; then
  echo "Done"
else
  echo "Error: stopped"
  exit 1
fi