SSH运行时后台进程输出换行符异常的原因及修复方案
后台进程输出换行错位问题解答
成因
正常终端默认开启ONLCR(输出换行自动转换为回车+换行)属性:程序输出\n时,终端会自动追加\r,实现光标下移的同时回到行首,保证输出对齐。
运行ssh命令时,ssh为了适配远程终端的交互逻辑,会临时关闭本地控制终端的ONLCR属性。此时后台进程输出的\n不会被自动补全\r,仅能实现光标下移,无法回到行首,就会出现阶梯状的错位输出。你主动在输出中添加\r能恢复正常,本质是绕开了终端ONLCR属性的限制,手动控制光标回到行首。
修复方案
- 方案1:适配输出格式
自行开发的程序可以直接将换行符替换为\r\n,和你测试的示例一致,无需额外配置即可兼容不同终端属性:{ sleep 5; echo -en "1\r\n2\r\n3\r\n" ; } & - 方案2:输出层统一补全回车符
无需修改原程序逻辑,给后台进程的输出套一层管道自动补全行尾\r:{ sleep 5; echo -e "1\n2\n3" ; } | sed 's/$/\r/g' & - 方案3:避免直接输出到交互终端
把后台进程的输出重定向到日志文件,从根源避免和前台交互命令抢占终端、受终端属性变更影响:{ sleep 5; echo -e "1\n2\n3" ; } > ./background_output.log 2>&1 & - 方案4:用终端复用器托管进程
长期运行的后台打印任务可以用tmux、screen这类终端复用器托管,这类工具会独立维护终端输出格式,不会受到当前操作终端的属性变更影响。
内容的提问来源于stack exchange,提问作者jozxyqk
相关产品推荐
相关产品推荐

