首页 > 解决方案 > 在 IEx Ports 的标准错误中强制回车?

问题描述

如果我在 IEx 中为将任何内容打印到 stderr 的脚本打开一个端口,则任何输出都不会用回车符打印。我怎样才能解决这个问题?我正在运行无法控制其输出的外部软件,因此我不能手动添加返回。

例子

/tmp/run.sh

#!/usr/bin/env bash
>&2 echo -e "line 1\nline 2\nline 3\nline 4"

在 IEx 外壳中

iex(1)> Port.open({:spawn_executable, "/tmp/run.sh"}, [])
line 1             
      line 2                                                                                                   
            line 3                                                                                             
                  line 4

标签: erlangelixirelixir-iex

解决方案


您可以在换行符之前插入回车符的包装器下运行脚本。这是一个使用bashand的包装器perl

#!/usr/bin/env bash
"$@" 2>&1 | perl -pe 's/\n/\r\n/' 1>&2

这是另一个使用bashand unix2dos

#!/usr/bin/env bash
"$@" 2>&1 | unix2dos 1>&2

基本上,可以读取原始程序的任何内容,stderr用回车和换行符组合替换换行符,然后将结果写入stderr将起作用。

将这些解决方案之一放在一个名为/tmp/lf.sh. 下面我们从 iex 使用您的 original 运行它/tmp/run.sh,首先使用原始脚本,然后使用包装器:

iex(1)> Port.open({:spawn_executable, "/tmp/run.sh"}, [])
#Port<0.5>
iex(2)> line 1
              line 2
                    line 3
                          line 4

nil
iex(3)> Port.open({:spawn_executable, "/tmp/lf.sh"}, [args: ["/tmp/run.sh"]])
#Port<0.6>
iex(4)> line 1
line 2
line 3
line 4

nil
iex(5)>

推荐阅读