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

Ruby中masscan_progress变量为何呈现两种不同输出?求指点

问题根源

\r(回车符)是终端控制字符,它只会把光标拉回行首,不会换行。你直接查看变量时,终端会解析这个字符——每遇到一个\r,后面的内容就会覆盖掉前面的,所以视觉上只看到最后一段进度,但变量里其实存着所有带\r的历史进度内容。而puts(不同语言实现逻辑不同)可能会把\r当成换行或者直接截断到最后一段,导致只输出最后一行有效内容。

解决办法

根据你的需求选对应的处理方式:

1. 只拿最新的进度内容

如果不需要历史进度,直接提取最后一段即可:

# 删掉最后一个\r之前的所有内容,只留最新进度
latest_progress="${masscan_progress##*$'\r'}"
# 验证输出
echo "$latest_progress"

这里$'\r'是shell里表示回车符的写法,##*是shell参数替换的语法,意思是从变量开头删到最后一个\r的位置。

2. 保留所有历史进度

要是需要把所有历史进度都展示出来,把\r换成换行符\n就行:

# 替换变量里所有\r为\n
full_progress="${masscan_progress//$'\r'/\\n}"
# 或者直接输出时替换
echo "$masscan_progress" | tr '\r' '\n'

处理完之后所有进度会按行排列,后续用grep之类的搜索命令就能正常匹配内容。

3. 从源头避免问题

既然你是用tail -n1抓的进度,说明masscan是用\r来实时刷新行内容的,不如直接在获取变量时就处理掉\r:

# 抓最后一行的同时把\r换成\n
masscan_progress=$(tail -n1 command 2>/dev/null | tr '\r' '\n')

这样变量里就不会有烦人的\r,后续操作不用再额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:01:19