Вы можете запустить скрипт в оболочке, которая вставляет возврат каретки перед новой строкой. Вот одна из таких оболочек, которая использует bash
и perl
:
#!/usr/bin/env bash
"$@" 2>&1 | perl -pe 's/\n/\r\n/' 1>&2
Вот еще одна, использующая bash
и unix2dos
:
#!/usr/bin/env bash
"$@" 2>&1 | unix2dos 1>&2
По сути, все, что может прочитать stderr
исходной программы, замените символ новой строки комбинацией возврата каретки и перевода строки, а затем запишите результат в stderr
.
Поместите одно из этих решений в файл с именем /tmp/lf.sh
. Ниже мы запускаем его из iex с вашим исходным /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)>