我正在运行一个简单的bash脚本
var=$(script.sh)
script.sh
的输出是这样的:
\r\n
123
ok
现在,当我这样做的时候:
echo $var
它返回\r\n
。它没有捕获123
和ok
。我想让var
得到整个输出。
在python中,我使用以下命令尝试了同样的操作:
bashCommand = ./myscript.sh
process = Popen(bashCommand.split(), stdout=subprocess.PIPE)
output, error = process.communicate()
print("Output", output)
但即使在这里,打印输出也会打印\r\n
如何捕获整个stdout
?更新:
下面是我的bash脚本xyz.sh
:
#! /bin/sh
set -x
./myscript.elf parm1 parm2 |{
while IFS= read -r line
do
echo "$line"
done
}
下面是./xyz.sh
的输出
+ ./myscript.elf parm1 parm2
+ IFS=
+ read -r line
>123
OK
>+ echo $'\r'
+ IFS=
+ read -r line
如果只在./myscript.elf parm1 parm2
行上运行该命令,则输出如下:
./myscript.elf parm1 parm2
>123
OK
>
发布于 2018-08-18 09:51:37
部分原因是IFS和糟糕的输出。
以下是解决方法示例:
script.sh > /tmp/file.log
var=""
while IFS= read -r line ;do
[ -z "$line" ] && continue
var="$line $var"
done < "${file}"
echo "$var"
基本上就是输出到一个文件,然后读取该文件并获取您真正需要的数据。等等。你的问题/code很难理解,这是我能想到的最好的办法了。
发布于 2018-08-18 13:37:26
在我看来,myscript.elf将其大部分输出发送到标准错误,而不是标准输出;因此,无论是$( )
还是通过管道将其发送到while read
循环都不能捕获它,它只是直接到达终端。如果要将错误输出合并到标准输出中,请将2>&1
附加到命令中,如下所示:
var=$(myscript.elf 2>&1)
或
./myscript.elf parm1 parm2 2>&1 | while read -r line
顺便说一句,在你的变量(和文件)中使用回车符容易引起混淆,所以你可能想要这样删除它们:
var=$(myscript.elf 2>&1 | tr -d '\r')
https://stackoverflow.com/questions/51903109
复制相似问题