3 回答
TA贡献1845条经验 获得超8个赞
尝试将stderr重定向到stdout并$()用于捕获它。换一种说法:
VAR=$((your-command-including-redirect) 2>&1)
由于您的命令将stdout重定向到某个地方,因此它不应干扰stderr。可能有一种更简洁的编写方法,但这应该可行。
编辑:
这确实有效。我已经测试过了:
#!/bin/bash
BLAH=$((
(
echo out >&1
echo err >&2
) 1>log
) 2>&1)
echo "BLAH=$BLAH"
将打印BLAH=err并且文件log包含out。
TA贡献1772条经验 获得超8个赞
对于Bash中的任何通用命令,您可以执行以下操作:
{ error=$(command 2>&1 1>&$out); } {out}>&1
常规输出正常出现,任何将stderr的内容都捕获在$ error中(使用它保存换行符时将其引用为“ $ error”)。要将stdout捕获到文件,只需在末尾添加重定向,例如:
{ error=$(ls /etc/passwd /etc/bad 2>&1 1>&$out); } {out}>&1 >output
分解它,从外面读入它:
为整个块创建文件描述$ out,复制stdout
在$ error中捕获整个命令的标准输出(但请参见下文)
该命令本身将stderr重定向到stdout(在上面捕获),然后将stdout从块外部重定向到原始stdout,因此仅捕获stderr
TA贡献1821条经验 获得超4个赞
您可以将stdout引用从重定向之前保存到另一个文件号(例如3)中,然后将stderr重定向到该文件:
result=$(mysqldump --user=$dbuser --password=$dbpswd \
--host=$host $mysqldb 3>&1 2>&3 | gzip > $filename)
因此3>&1会将文件编号3重定向到stdout(注意,这是在使用管道将stdout重定向之前)。然后2>&3将stderr重定向到3号文件,该文件现在与stdout相同。最后,将stdout通过馈入管道进行重定向,但这不会影响文件编号2和3(请注意,从gzip重定向stdout与mysqldump命令的输出无关)。
编辑:更新了命令以从命令重定向stderr mysqldump而不是gzip,我的第一个答案太快了。
- 3 回答
- 0 关注
- 837 浏览
添加回答
举报