erlang - 在 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
解决方案
您可以在换行符之前插入回车符的包装器下运行脚本。这是一个使用bash
and的包装器perl
:
#!/usr/bin/env bash
"$@" 2>&1 | perl -pe 's/\n/\r\n/' 1>&2
这是另一个使用bash
and 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)>
推荐阅读
- java - 我不确定为什么我的程序不断崩溃
- wordpress - 如何将一个站点页面数据获取到 WordPress 多站点中的另一个站点页面
- sql-server - SQL Server 复制数据库向导 -w/o- 登录提示错误 (SMO) 用户、组或角色“x”已存在于当前数据库中
- c++ - 将 boost 函数与 boost 绑定与地图一起使用
- javascript - 如果所选选项的值动态更改,则选择标签值不会更新
- c# - 无法加载文件或程序集或其依赖项之一,错误消息正在更改
- apache-pulsar - 错误没有这样的文件或目录:_pulsar.so
- spring-boot - @ConditionalOnMissingBean 不能被覆盖
- android - 如何创建不同形状的浮动操作按钮
- firebase - Firebase Cloud Functions 调度程序位置