【问题标题】:Prevent Bash from printing characters that were typed while before Bash fully loaded防止 Bash 打印在 Bash 完全加载之前输入的字符
【发布时间】:2019-04-15 00:21:06
【问题描述】:

任何拥有复杂 .bashrc 文件的人都可能遇到过这种情况。如果您在 Bash 加载时键入任何内容,则在加载后,您键入的字符会同时打印在提示符的左侧和右侧。

例如...

重现步骤

  1. sleep 5 添加到您的 .bashrc 文件的底部
  2. 关闭并重新打开您的终端模拟器
  3. 在终端加载之后,但在 Bash 完成加载之前,键入 asdf

实际结果

asdfuser@hostname$ asdf

想要的结果

user@hostname$ asdf

有没有什么方法可以清除提示左侧的文本,或者阻止它从一开始就出现,而不需要执行 clearreset ?

(不管它有什么价值,我问是因为我想以编程方式创建一个 tmux 会话,该会话将某些文本打印到提示而不执行它。这种情况一直在发生,因为 tmux 在 Bash 完成加载之前打印文本。但是这个甚至在 tmux 之外也会发生,就像上面的重现步骤一样,所以我不确定我对 tmux 的使用与这个问题有多相关。)

【问题讨论】:

  • bash 对您的键盘一无所知;它的标准输入只是其父提供的打开文件描述符。您的 终端(或终端仿真器)负责将键盘输入转换为字节流以提供给 shell,并在 addition 中将任何键盘输入回显到屏幕将其传递给 shell 的输入。
  • 同样,当我登录时,我必须在用户名后等待提示返回,否则密码会在密码提示aPassword:***周围拆分...不好看。
  • @chepner 这很有道理。这让我想知道:如果 shell 可以在事后清除该文本 (reset) 是否也不能被告知要隐藏它?
  • 再一次,当文本被写入时,Bash 正在运行。它已开始读取其配置,但尚未完成。
  • reset 除了写入一个字节(或字节序列),终端仿真器将其解释为清除屏幕的指令(而不是按字面意思打印字节)之外,什么也不做与外壳。

标签: bash shell terminal prompt tmux


【解决方案1】:

问题是 tmux 和大多数其他终端将创建启用 ECHO 的 ptys,因此字符将在 shell 启动之前由内核回显。从理论上讲,您可以阻止 tmux 执行此操作,然后让 bash 将其打开,但这意味着对两者的代码都进行了更改,并且可能会导致其他应用程序出现问题。

一个简单的选择是在创建窗格后让 tmux 休眠一小段时间以让 shell 启动,例如:

tmux 拆分 \;运行“睡眠 0.5”\;发送“abcdef”

(即使是更小的睡眠也可能有效,您可以进行实验。)

我不了解 bash,但 ksh 至少似乎可以根据需要设置 tty,因此您也可以使用等待,例如:

tmux splitw "stty -echo; tmux wait -S foo; exec $SHELL" \;等待富\;发送“abcdef”

不过我会自己去睡觉。

【讨论】:

    【解决方案2】:

    有人建议清除文本,我猜你可以这样做,我知道 bash 有 C-l (L):

    tmux 拆分 \;发送 C-l "abcdef"

    这显然不适用于 ssh 之类的东西,仅适用于 shell。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-08
      • 2015-11-22
      相关资源
      最近更新 更多