防止Bash打印在Bash完全加载之前输入的字符

时间:2019-04-15 00:21:06

标签: bash shell terminal prompt tmux

具有复杂的 .bashrc 文件的任何人都可能遇到此问题。如果在加载Bash时键入任何内容,则在加载提示时,键入的字符将同时显示在提示的左侧和右侧。

例如...

复制步骤

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

实际结果

asdfuser @ hostname $ asdf

所需结果

user @ hostname $ asdf

是否有任何方法可以清除提示左侧的文本,或者防止出现该文本而无需进行 clear reset

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

2 个答案:

答案 0 :(得分:0)

问题在于tmux和大多数其他终端将在启用ECHO的情况下创建pty,因此内核甚至会在外壳启动之前回显这些字符。从理论上讲,您可以阻止tmux执行此操作,然后让bash启用它,但这将意味着对两者的代码更改都可能会导致其他应用程序出现问题。

一个简单的选择是在创建允许外壳启动的窗格之后让tmux短暂睡眠,例如:

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

(即使睡眠量较小,也可以尝试。)

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

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

我还是自己睡觉。

答案 1 :(得分:0)

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

tmux splitw \;发送C-l“ abcdef”

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