AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 469770
Accepted
pLumo
pLumo
Asked: 2018-09-19 02:42:39 +0800 CST2018-09-19 02:42:39 +0800 CST 2018-09-19 02:42:39 +0800 CST

运行 `top -n1 | 时光标消失 头`

  • 772

跑步时

top -n1 | head

终端的光标消失。跑步top -n1会把它带回来。

在 Ubuntu 16.04 和 CentOS 7.5 中gnome-terminal测试。tilix


运行top -n1 | tail没有这个问题,所以我认为,输出末尾的一些东西让光标重新出现,这在打印唯一top时没有执行。head

是什么原因造成的,我怎样才能更优雅地取回光标?

terminal gnome-terminal
  • 2 2 个回答
  • 1813 Views

2 个回答

  • Voted
  1. Daniele Santi
    2018-09-19T02:52:09+08:002018-09-19T02:52:09+08:00

    恕我直言,最好的方法是top使用“批处理”模式(-b标志),该模式旨在用于非交互式用例,例如管道到另一个程序或文件。

    所以这

    top -n1 -b | head
    

    不会在没有光标的情况下离开外壳。

    至于为什么光标消失了......

    由于top是一个交互式程序,它与终端“混淆”以获取输入、滚动内容等,并隐藏光标。

    终止时,它必须恢复被调用前的光标和显示状态,它通过向终端本身发送一个或多个控制代码来实现。

    通过管道传递命令head,此控制代码将无法通过(head默认情况下仅打印前 10 行,并且两者的输出top以及用于恢复终端状态的控制代码始终 > 10 行)。

    事实上,如果你给head了足够多的行来打印,光标就会出现!

    例如,

    top -n1 | head -n 100
    

    在我的系统上留下一个光标。

    • 17
  2. Best Answer
    Digital Trauma
    2018-09-19T12:56:07+08:002018-09-19T12:56:07+08:00

    我无法在任何地方重新创建这种行为,但它确实出现在 Ubuntu 18.04


    检查顶部输出的十六进制转储是有益的:

    $ top -n1 | head -n1 | xxd
    00000000: 1b5b 3f31 681b 3d1b 5b3f 3235 6c1b 5b48  .[?1h.=.[?25l.[H
    00000010: 1b5b 324a 1b28 421b 5b6d 746f 7020 2d20  .[2J.(B.[mtop - 
    00000020: 3133 3a34 333a 3034 2075 7020 3120 6d69  13:43:04 up 1 mi
    00000030: 6e2c 2020 3120 7573 6572 2c20 206c 6f61  n,  1 user,  loa
    00000040: 6420 6176 6572 6167 653a 2030 2e38 312c  d average: 0.81,
    00000050: 2030 2e35 342c 2030 2e32 321b 2842 1b5b   0.54, 0.22.(B.[
    00000060: 6d1b 5b33 393b 3439 6d1b 2842 1b5b 6d1b  m.[39;49m.(B.[m.
    00000070: 5b33 393b 3439 6d1b 5b4b 0a              [39;49m.[K.
    $ top -n1 | tail -n1 | xxd
    00000000: 1b5b 3f31 326c 1b5b 3f32 3568 1b5b 4b    .[?12l.[?25h.[K
    $ 
    

    特别是,开头的序列0x1b5b3f是ANSI 转义序列,它们实际上是元数据,用于控制光标位置和文本颜色等内容。

    特别是,在顶部输出的第一行的开头,有ESC [?25l,而在最后一行的末尾是ESC [?25h。根据维基百科页面,这些是隐藏和显示光标的相应代码。

    通过将top -n1输出传送到head,终端将在开始时收到 hide-cursor 命令,但在结束时不会收到 show-cursor 命令,因此光标将保持不可见,直到某些其他操作再次将其打开。

    @MrShunz 建议使用该-b选项top是正确的。此选项禁用 top 输出中的所有 ANSI 转义序列,而只是输出纯 ASCII 可打印文本。top在执行with期间不会损坏游标-b:

    $ top -b -n1 | head -n1 | xxd
    00000000: 746f 7020 2d20 3133 3a35 393a 3236 2075  top - 13:59:26 u
    00000010: 7020 3138 206d 696e 2c20 2031 2075 7365  p 18 min,  1 use
    00000020: 722c 2020 6c6f 6164 2061 7665 7261 6765  r,  load average
    00000030: 3a20 302e 3134 2c20 302e 3036 2c20 302e  : 0.14, 0.06, 0.
    00000040: 3037 0a                                  07.
    $ 
    
    • 6

相关问题

  • 寻找终端下载管理器

  • 语法错误:fd 编号错误?

  • traceroute,只打印网关信息

  • 如何在 ssh 上运行一瞥?

  • 备份 Nand Flash 存储区

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve