You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复script(1)工具输出的换行问题以适配lnav?

解决script(1)日志CR+LF换行导致lnav显示异常的问题

方向一:修改script(1)输出,把CR转成LF

方法1:用管道过滤输出

直接在script命令后加管道,用tr工具把所有CR字符替换成LF,彻底修正换行格式。修改原脚本里的script调用部分:

env TERM=dumb script -a -q /dev/stdout -c "$(cat <<- EOF
    lftp $PROTOCOL://$URL -u ${USER},${PASS} << EOFF
    set dns:fatal-timeout never
    set sftp:auto-confirm yes
    set mirror:use-pget-n 50
    set mirror:parallel-transfer-count 2
    set mirror:parallel-directories yes
    set mirror:include-regex $REGEX
    set log:enabled/xfer yes
    set log:file/xfer $LOG
    set xfer:use-temp-file yes
    set xfer:temp-file-name *.lftp
    mirror -c -v --loop --Remove-source-dirs "$REMOTEDIR" "$LOCALDIR"
    quit
    EOFF
EOF
)" | tr '\r' '\n' > $LOGSTDOUT
  • -q 参数让script不输出多余的启动/结束提示信息
  • 把script的输出导向标准输出,再通过tr '\r' '\n'替换所有CR为LF,最后写入日志文件

方法2:用script原生参数(部分系统支持)

GNU版本的script支持--output-lf参数,直接强制输出LF换行,无需额外过滤。如果你的系统是GNU环境,直接修改脚本:

env TERM=dumb script -a --output-lf $LOGSTDOUT -c "$(cat <<- EOF
    # 原lftp命令内容不变
EOF
)"

先运行script --help检查是否支持该参数,BSD系统的script可能没有这个选项。

方向二:让lnav把CR当作LF处理

如果不想修改日志生成流程,可以给lnav添加自定义格式规则,让它将CR识别为换行符。

步骤1:创建自定义格式文件

在~/.config/lnav/formats/目录下创建script-cr-fix.json文件,内容如下:

{
    "script_log": {
        "title": "Script Log with CR Line Endings",
        "description": "Fixes CR line endings from script(1)",
        "regex": {
            "line": "(?s)(.*?)(?:\\r|\\n|\\r\\n)"
        }
    }
}

这个规则会匹配所有以CR、LF或CRLF结尾的行,将CR视为换行分隔符。

步骤2:加载格式并查看日志

启动lnav时指定加载该格式:

lnav -f ~/.config/lnav/formats/script-cr-fix.json $LOGSTDOUT

之后lnav就能正确解析日志中的CR换行,显示正常内容。

内容的提问来源于stack exchange,提问作者mwsmws22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 06:14:55