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 / 问题 / 794105
Accepted
Ivoirians
Ivoirians
Asked: 2025-04-24 04:29:39 +0800 CST2025-04-24 04:29:39 +0800 CST 2025-04-24 04:29:39 +0800 CST

如何删除脚本执行期间写入终端的缓冲文本

  • 772

假设我正在执行一个长时间运行的 bash 脚本,并且在运行时,我不小心右键单击终端并将敏感密码(刚从密码管理器中复制出来的)粘贴到终端中。

~$ process_data.sh
[useful data 1]
[useful data 2]
...
[useful data N-1]
hunter2[useful data N]
[useful data N+1]

有什么方法可以删除终端上显示的文本 (hunter2),同时保留有用的数据? Ctrl-L 可以clear删除屏幕上的所有内容。Ctrl-H 可以删除当前行的字符,但我无法将光标向上移动。

我不需要从中删除文本~/.bash_history,我只是希望有用的数据显示在终端中,而没有令人反感的文本。

我认为答案可能取决于终端的功能/实现。我使用的是 Ubuntu 18,但任何针对常见终端的解决方案都将不胜感激。

shell
  • 3 3 个回答
  • 772 Views

3 个回答

  • Voted
  1. Chris Davies
    2025-04-24T05:47:48+08:002025-04-24T05:47:48+08:00

    不。

    您可以使用Ctrlu取消输入缓冲区,这样您就不会意外地将其作为命令输入Enter。但是您无法删除已粘贴到当前行上一行的文本。

    是的。

    如果您可以访问同一台计算机上的另一个终端会话,则可以将相应的字符序列发送到有问题的终端会话,以覆盖非预期的文本。当然,如果应用程序已经完成,您也可以直接运行它。例如

    tput sc                       # Save current cursor position
    tput cup 3 0                  # Fourth line, first column
    printf '%s' 'hello, world'    # Overwrite
    tput rc                       # Restore saved cursor position
    

    如果有必要,将所有这些作为单个块重定向到有问题的终端

    (
        tput…
    ) >/dev/tty/12345
    
    • 11
  2. Best Answer
    Stéphane Chazelas
    2025-04-24T15:43:59+08:002025-04-24T15:43:59+08:00

    如果你运行:

    (t=$(stty -g); stty -echoctl; tput rmkx; tput sc; read -r _; tput rc; stty "$t")
    

    然后,您将能够使用箭头键在屏幕上移动,用空格覆盖您需要的内容,然后按Enter返回提示。

    • t=$(stty -g)保存当前 tty 设置
    • stty -echoctl^X禁用大多数控制字符的回显更改(例如ESC 键)的行为^[。相反,它们将以原始格式发送到终端。
    • tput rmkx。确保终端未处于键盘模式。在大多数终端中,非键盘模式时,按下箭头键时发送的字符序列(第一个字符是 ESC 控制字符)恰好对应于终端接收后识别的转义序列,从而将光标移动到相应方向。例如,按下Up会发送<ESC>[A序列,而该序列发送到终端时(例如,通过回显您键入的内容)会使光标向上移动。如果没有rmkx,您可能会发现终端发送的<ESC>OA回显不会将光标向上移动,而是显示A。
    • tput sc s避免了c鼠标位置
    • read -r _直到你按下Enter
    • tput rc r恢复c鼠标位置
    • stty "$t"恢复之前保存的 tty 设置。

    我们没有这样做stty smkx,因为我们不知道键盘模式是否事先启用(并且据我所知,在这方面没有简单/便携的等效方法stty -g来保存终端的内部状态)。

    请注意,您将无法通过这种方式更改已经滚出屏幕的文本。

    如果使用 GNU终端多路复用器,即使终端中仍有应用程序运行,您也可以作为过滤器screen的一部分执行相同的操作:调出提示符(默认情况下为+ , ),然后输入:execscreenCrtla:

    exec ... sh -c 'stty -echoctl; tput rmkx; tput sc; read -r x; tput rc'
    

    在那里也做同样的事情。在这种情况下,不需要保存和恢复 tty 设置,因为exec会生成一个新的伪终端设备。

    • 5
  3. Olivier Dulac
    2025-04-24T16:19:01+08:002025-04-24T16:19:01+08:00

    这看起来确实像个XY问题:你真正需要的可能是根本不显示“hunter2”?但你问的是一个可能的“解决方案”:之后如何删除它?

    如果真正的问题是避免显示某些内容(这里,可能是您输入到“读取”中的某些内容?):

    printf "Please enter something (and finish it by Enter):\n"
    stty -echo
    IFS= read -r answer
    stty echo
    printf '\n You entered: "%s"\n' "${answer}"
    printf '\n          or: "%s"\n' "${answer}" | cat -v # show some invisible chars as : ^n
    

    如果您需要输入可能也包含 Enter,那么您也可以将 tty 置于原始模式(但它会变得有点棘手)

    • 0

相关问题

  • 这个命令是如何工作的?mkfifo /tmp/f; 猫/tmp/f | /bin/sh -i 2>&1 | 数控 -l 1234 > /tmp/f

  • FreeBSD 的 sh:列出函数

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • grep -v grep 有什么作用

  • 如何将带有〜的路径保存到变量中?

Sidebar

Stats

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

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

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

    • 4 个回答
  • Marko Smith

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

    • 5 个回答
  • Marko Smith

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

    • 3 个回答
  • 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
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +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

热门标签

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