而且不要说“ $TERM
”-总是这样xterm
。
bash
脚本如何分辨运行在哪个终端,特别是iTerm,Terminal.app或实际上是xterm?
我问,因为reset
在Terminal.app和iTerm2上开箱即用不起作用¹。但是,iTerm2确实可以识别出进行终端复位(\x1b]50;ClearScrollback\x07
)的转义序列,并且如果可以检测到它,则可以reset
使用做正确的事情的别名进行覆盖。AFAICT,Terminal.app缺少重设序列,人们诉诸于荒谬的tom-hackery来破解它。
我的最终目标是reset
无论在OS X还是Linux上都可以进行相同的工作,无论是在本地还是通过SSH进行远程工作。(我不想试图记住哪一个,这样做reset && command-that-outputs-a-bunch
并进行上一步工作很有用。)Terminal.app和iTerm通过未reset
正确实施在该计划中投入了精力。
这意味着仅仅重写reset
还不够:如果我在Linux机器上,它需要知道我使用的是gnome-terminal
iTerm还是iTerm,以便发送正确的转义序列。
有什么办法(即使我需要ioctl
)也可以询问终端机的实际情况?
¹就此问题而言,重设应清除屏幕,重设光标并擦拭回滚缓冲区。
reset
,因为这是我的手指知道的。
reset
命令清除终端仿真器的回滚内容,但这不能保证做到这一点,因为回滚是终端仿真器特定的功能,而不是真正的终端的一部分。但是,终端支持ED(显示擦除)转义序列的扩展,以消除向后滚动ESC [ 3 J
。您可以清除屏幕,然后使用它,例如reset && printf '\e[3J’
xterm
(通过TERM=xterm
),我希望您模拟XTerm的超集,该超集将在重置时清除其回滚。(就像您将转义序列发送为“ blue”一样,您可能希望得到blue。)当然,我的xterm告诉我Erase is backspace.
,我很庆幸没有做任何其他事情。那很烦人。
Terminal.app
的设置,终端选项卡并将回滚行设置为0,会发生什么情况?这会禁用当前行上方的所有文字,还是仅禁用屏幕上方上方的所有文字?我知道,这不完全是您要求的,值得一试。