我有一个命令,当它运行正常时,它会写入 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
,查看命令是否成功运行,并且仍然将命令的结果存储在变量stdout
中stderr
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