Linux 在函数中重定向stderr

Linux 在函数中重定向stderr,linux,bash,shell,unix,sh,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 (重新编辑以回答问题) 如果要捕获apt get命令的stderr

在特定函数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
(重新编辑以回答问题)

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

apt-get ..... 2>$tmp_file || (echo "Failed! Check $ERR_LOG" | cat - $tmp_file) 

如果需要,
cat
可以选择性地重定向到stderr。

使用此命令将错误重定向到日志文件

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
试试这个

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

这将把命令的stderr输出放在错误日志文件中,稍后您将从error方法打印该文件,并将stdout设置为原始命令中的
dev/null

您要查找的内容称为“进程替换”,您可以在bash的手册页的“扩展”部分中阅读

任何文件句柄(包括stdout和stderr)都可以重定向到文件或管道。
(命令)
的符号处理输出。只要定义了shell函数,就可以使用命令。例如,尝试以下方法:

#!/bin/bash

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

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

ls -l /bin/ls /nonexistent 2> >(errout) > >(stdout)
在我的系统上,
ls
将为
/bin/ls
显示一行到标准输出的代码,并为
/nonexistent
显示一个到标准输出的错误:

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

注意重定向的顺序。重定向按照它们出现的顺序处理,从左到右。

您要求重定向错误到文件。函数应该将先前命令的STDRR输出重定向到一个特定文件,然后运行ECHO“失败!检查$ErryLoad”DKY,您考虑使用<代码> Logger-<代码>(命令执行<代码> SysLog)。?我已经尝试过-stderr输出仍然显示在屏幕上。尝试这一回显“失败!检查$ERR_LOG”2>LOG_文件它会将错误重定向到文件,直到相同的事情发生(抱歉-误解的问题-您想重定向stderr或get apt命令,而不是错误动作()它正在工作,但有一点不像我想要的那样-2>$ERR\u LOG应该在某种程度上起作用。