【问题标题】:Garbled shell newlines after concurrent script execution并发脚本执行后shell换行符乱码
【发布时间】:2014-02-08 09:59:18
【问题描述】:

我正在尝试从 makefile 中同时执行一个 shell 脚本,并将所有输出都转到标准输出,但是当我这样做时,换行符会变得乱码,我发现的唯一可靠的修复方法是 reset

制作文件:

all: t1 t2 t3 t4
t1 t2 t3 t4:
    @./test.sh true

test.sh:

#!/bin/bash
script -q /dev/null "$@" 2>&1 > /dev/null 2>&1

调用:

$ make -j

没有你期望的输出,但有时它会破坏终端,我必须reset

有时换行和回车在运行后不起作用:

Devbox:Desktop user$ time make -j
real    0m0.019s
                user    0m0.019s
                                sys 0m0.022s
                                                Devbox:Desktop user$

从脚本中删除 script 并将该行替换为 "$@" 可以使其正常工作,但我正在使用脚本来保留命令的颜色输出。

LOG=$(script -q /dev/null "$@" 2>&1 | tr -d '\r' | cat)

【问题讨论】:

    标签: bash shell unix makefile


    【解决方案1】:

    我认为script 在这里不是合适的程序。我曾经给过answer 如何欺骗程序进行彩色输出,即使它们的输出没有使用LD_PRELOAD 和覆盖版本的glibc 函数isatty() 到达终端。

    基于此,您的 test.sh 可能如下所示:

    #!/bin/bash
    output=$(LD_PRELOAD=./libisatty.so $@)
    return_value=$?
    
    echo -e "$output"
    exit $return_value
    

    你的Makefile 是这样的:

    all: t1 t2 t3 t4$ 
    t1 t2 t3 t4:$
    ^I@./test.sh ls -al --color=auto$
    

    【讨论】:

    • 2>&1 用于"$@",但我可能也应该这样做。不幸的是,即使进行了重定向,问题仍然存在。我已经适当地编辑了我的问题。
    • 哦,在这种情况下我可能错了。将准备您的设置并尝试重现.. 听起来很有趣 :)
    • 试过你的设置,它给了我一个没有任何回声输出的交互式外壳。我可以把这个留给exit。你能用一句话解释你想要达到的目标吗? :) 如果只是“抑制彩色输出”,也许有更好的方法
    • 我正在尝试将命令的彩色输出保存到变量中,测试返回状态,然后在返回状态非零时打印输出。我正在尝试从 make 同时执行此操作。有时它可以正常工作,但大多数时候它会破坏终端。
    • 这些命令都没有,但我打算将这种命令与 makefile 中的 clang 一起使用。
    猜你喜欢
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 2014-05-15
    • 2017-06-23
    • 1970-01-01
    • 2019-12-29
    • 2014-03-26
    • 1970-01-01
    相关资源
    最近更新 更多