在功能中重定向stderr

时间:2014-02-28 12:02:58

标签: linux bash shell unix sh

有没有办法将特定函数stderr从上一个命令重定向到文件?以下是示例代码:

#! /bin/bash

error_action () {
    echo "Failed! Check $ERR_LOG" 
    exit 1
}

apt-get install -y build-essential linux-headers-$(uname -r) >/dev/null || error_action

4 个答案:

答案 0 :(得分:1)

您正在寻找的东西称为“流程替换”,您可以在bash的“扩展”部分的手册页中阅读它。

任何文件句柄(包括stdout和stderr)都可以重定向到文件或管道。 <(command)的表示法处理来自命令的输入重定向,>(command)处理输出。只要你定义了shell函数,那就可以成为你的命令了。例如,试试这个:

#!/bin/bash

errout () {
  sed 's/^/ERROR> /'
}

stdout () {
  sed 's/^/stdout> /'
}

ls -l /bin/ls /nonexistent 2> >(errout) > >(stdout)

在我的系统上,ls会显示/bin/ls到stdout的行,并会显示/nonexistent的错误,该错误会转到stderr:

$ ./errtest
ERROR> ls: /nonexistent: No such file or directory
stdout> -r-xr-xr-x  1 root  wheel  32672 Nov  8  2012 /bin/ls
$ 

请注意重定向的顺序。重定向按它们从左到右的顺序处理。

答案 1 :(得分:0)

(reedit回答问题)

如果要捕获apt-get命令的stderr输出并在检查命令的退出状态后使用它,最好的方法是在文件中捕获输出,然后{{1}它出来

cat

如果需要,可以选择将apt-get ..... 2>$tmp_file || (echo "Failed! Check $ERR_LOG" | cat - $tmp_file) 重定向到stderr。

答案 2 :(得分:0)

试试这个,

apt-get install -y build-essential linux-headers-$(uname -r) 2>$ERR_LOG 1>/dev/null || error_action

这会将命令的stderr输出放在错误日志文件中,稍后从错误方法打印,并将stdout输出到原始命令中的dev/null

答案 3 :(得分:-1)

使用此命令将错误重定向到log_file

echo "Failed! Check $ERR_LOG" 2>log_file

将错误重定向到dev / null并在屏幕上打印输出

apt-get install -y build-essential linux-headers-$(uname -r) 2>/dev/null || error_action