有没有办法将特定函数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
答案 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