如果成功,则将 stdout 重定向到 command-A,否则将 stderr 重定向到 command-b。同时避免使用临时文件

如果成功,则将 stdout 重定向到 command-A,否则将 stderr 重定向到 command-b。同时避免使用临时文件

我有一个命令,当它运行正常时,它会写入 stdout,当它运行不正常时,它会写入 stderr。我想检查命令的退出状态,并使用 stdout 或 stderr 执行某些操作。

if ! command >/tmp/stdout 2>/tmp/stderr; then
  // do something with /tmp/stderr
  exit 1
fi

// do something else with /tmp/stdout

当然可以只有一个文件而不是两个,但我想删除所有文件,而不仅仅是一个。

有没有办法避免临时文件?我尝试使用 mkfifo 和自定义文件描述符,但无法实现该功能。

答案1

$(..)您可以在条件中使用命令替换语法if,查看命令是否成功运行,并且仍然将命令的结果存储在变量stdoutstderr

if ! var=$(cmd 2>&1); then
    printf 'process stderr contents from $var'
fi

如果我模拟cmd运行一个简单的脚本来执行此操作,您可以看到它正在工作

# cat temp.sh    
echo foo >&2
exit 1

如果我运行脚本

if ! var=$(bash tmp.sh 2>&1); then
    printf '%s\n' 'process stderr contents from $var'
    printf '%s\n' "$var"
fi

stdout如果命令替换成功(恰好出现在else上例中的子句中),您可以使用同样的方法来捕获它。在任何一种情况下,操作内容"$var"(确保引号打开)将确保您处理结果就像将其存储在文件中一样。

您可以进一步引用命令替换语法来不是让 shell 对结果执行分词。例如,按如下方式进行。对于像我在这里展示的那样简单的情况可能不需要它,但对于结果包含一些特殊 shell 元字符的情况

if ! var="$(bash tmp.sh 2>&1)"; then

注意:自答案的第一个版本发布以来,问题标题已重新措辞。

答案2

你可以使用下面的代码

if [[ $? == 0 ]]
then
command 1>stdout.txt
else
echo "exit code is not successfull"
command 2> stderr.txt
fi

相关内容