【问题标题】:How to handle \r\n from command output in python or bash如何在 python 或 bash 中处理命令输出中的 \r\n
【发布时间】:2019-01-24 22:51:04
【问题描述】:

我正在运行一个简单的 bash 脚本

var=$(script.sh)

script.sh 的输出格式为:

\r\n

123

ok

现在当我这样做时:

echo $var 它返回\r\n。它没有捕获123ok。我希望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
>

【问题讨论】:

  • 其他内容实际上是打印到标准输出而不是标准错误吗?
  • 我跑了echo $var,得到了123 ok。我无法重现您的错误。
  • 当你说\r\n时,你的意思是反斜杠r反斜杠n,还是回车换行符?
  • 它的回车换行。 bash 认为它已到达命令末尾并在第一行停止。
  • 我想知道命令行是否正在添加新行或者它实际上是你的程序。尝试先通过管道传输到文件,然后使用xxd 分析十六进制以确定其中是否实际存在新行。

标签: python bash shell newline


【解决方案1】:

部分原因是 IFS 和糟糕的输出。

解决方法示例:

 script.sh > /tmp/file.log
 var=""
 while IFS= read -r line ;do
     [ -z "$line" ] && continue
     var="$line $var"
 done < "${file}"
 echo "$var"

基本上输出到一个文件,然后读取文件并获取你真正需要的数据..等等.. PS>你的问题/代码很难理解这是我能想到的最好的。

【讨论】:

    【解决方案2】:

    在我看来 myscript.elf 将其大部分输出发送到标准错误而不是标准输出;因此,$( ) 或将其传送到while read 循环都不会捕获它,它只是直接进入终端。如果要将错误输出合并到标准输出中,请将2&gt;&amp;1 附加到命令中,如下所示:

    var=$(myscript.elf 2>&1)
    

    ./myscript.elf parm1 parm2 2>&1 | while read -r line
    

    顺便说一句,在变量(和文件)中包含回车往往会引起混淆,因此您可能希望使用以下内容删除它们:

    var=$(myscript.elf 2>&1 | tr -d '\r')
    

    【讨论】:

      猜你喜欢
      • 2014-04-04
      • 1970-01-01
      • 2021-05-21
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多