Bash 重定向stderr并保留stdout

Bash 重定向stderr并保留stdout,bash,stdout,stderr,Bash,Stdout,Stderr,我想写一个bash脚本,它应该调用几个python脚本。 在python脚本中有几个打印消息,我不允许更改这些消息。我想将计算的最终状态解析到bash脚本中,以决定下一步要做什么。 我的计划是构建python文件,如下所示: 导入系统 print('这只是脚本中的一些打印消息') print('这只是脚本中的一些打印消息') sys.stderr.write('0或1表示错误或成功') 并重定向bash脚本中的stderr(但仍在终端上保留print函数的输出) errormessage=“$

我想写一个
bash
脚本,它应该调用几个
python
脚本。 在
python
脚本中有几个打印消息,我不允许更改这些消息。我想将计算的最终状态解析到bash脚本中,以决定下一步要做什么。 我的计划是构建
python
文件,如下所示:

导入系统 print('这只是脚本中的一些打印消息') print('这只是脚本中的一些打印消息') sys.stderr.write('0或1表示错误或成功') 并重定向bash脚本中的
stderr
(但仍在终端上保留
print
函数的输出)

errormessage=“$(仅用于重定向的python pyscript.py命令)”
有人能帮我重定向
stderr
?我找到的所有解决方案都不会保持
print
函数的输出(大多数人将
stdout
设置为null)

而且:如果有人有一个更聪明(和稳定)的想法来交出计算结果,那将非常感激

预期输出:

pyscript.py

导入系统 print('这只是脚本中的一些打印消息') print('这只是脚本中的一些打印消息') sys.stderr.write('0或1表示错误或成功') bashscript.sh

#/bin/bash
LINE=“++++++++++++++++++++++++++++++++++++++++++++”
errormessage=“$(python pyscript.py命令\u仅用于重定向\u stderr\u)”
回音$线
echo“错误变量为${errormessage}”
调用
bash bashscript.sh
时输出:

this is just some print messages within the script
this is just some print messages within the script
+++++++++++++++++++++++++
Error variable is 0/1

您可以交换stderr和stdout,并将stderr存储在一个变量中,您可以在脚本末尾回显该变量。 因此,请尝试以下方法:

#!/bin/bash
line="+++++++++++++++++++++++++"
python pyscript.py 3>&2 2>&1 1>&3 | read errormessage
echo "$line"
echo "Error variable is ${errormessage}"

这将正常打印stdout,并在末尾打印stderr。

您可以交换stderr和stdout,并将stderr存储在一个变量中,您可以在脚本末尾回显该变量。 因此,请尝试以下方法:

#!/bin/bash
line="+++++++++++++++++++++++++"
python pyscript.py 3>&2 2>&1 1>&3 | read errormessage
echo "$line"
echo "Error variable is ${errormessage}"

这应该像平常一样打印你的stdout,并在最后打印stderr。

也许我在监督某些东西,但在建议的答案中,当你想将stderr重定向到一个变量并将stdout保留在终端上时,正好缺少了这种情况。这已经得到了回答,也许我在监督某些东西,但他们在建议的答案中有当您希望将stderr重定向到变量并将stdout保留在终端上时,正好缺少这种情况。此问题已得到回答,谢谢您的回答!不幸的是,当我运行脚本时,$errormessage变量是空的。很抱歉,您必须删除(python pyscript.py 3>&2>&1 1>&3)周围的括号,因为它仍然是空的。。。但是errormessage=$(python pyscript.py 3>&22>&11>&3)可以工作。。。非常感谢
阅读
,在管道末端,可以在子外壳中运行。这是一个常见问题;谢谢你的回答!不幸的是,当我运行脚本时,$errormessage变量是空的。很抱歉,您必须删除(python pyscript.py 3>&2>&1 1>&3)周围的括号,因为它仍然是空的。。。但是errormessage=$(python pyscript.py 3>&22>&11>&3)可以工作。。。非常感谢
阅读
,在管道末端,可以在子外壳中运行。这是一个常见问题;