我可以配置bash在控制台中键入每个命令之前执行“清除”吗?


22

我想将bash配置为clear每次在终端中键入某些命令时都执行命令(在执行命令之前)。我怎样才能做到这一点?

我正在使用Debian Linux。


您发现线程很有用。
雷神

3
只是好奇:您为此申请什么?当我调试程序与大量输出除,我通常要尽可能地保持在屏幕上,帮我记录我在工作范围内的。
乔·

Answers:


22

Bash有一个预指令钩子。有点。

preexec () {
  clear
}
preexec_invoke_exec () {
    [ -n "$COMP_LINE" ] && return                     # do nothing if completing
    [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
    local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`; # obtain the command from the history, removing the history number at the beginning
    preexec "$this_command"
}
trap 'preexec_invoke_exec' DEBUG

吉尔斯:我将以上内容粘贴到konsole终端中,随后我输入的每个命令的输出在我读之前都已清除。我想念什么吗?另外,如果我调用多行bash脚本,其中多于一行(或除最后一行以外的任何一行)生成有趣的输出,会发生什么(以及下面的其他答案)?
2012年

@Joe Enter在执行命令之前,按键后应清除屏幕。对我来说,它像这样工作。对于每个交互式命令都会执行preexec挂钩,无论该命令是内置命令,外部命令还是许多命令都无关紧要。
吉尔斯(Gilles)'所以

1
@Joe您需要在此行添加以下内容,如果完成[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return;,则不执行任何操作: 问题是PROMPT_COMMAND正在运行,并且在实际命令之后也被捕获;还可以有人告诉我为什么 local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;在这里吗?
MageProspero 2013年

@JamesAndino history -1打印最后一个命令行,并在前面加上历史记录号。sed过滤器将删除历史记录编号。
吉尔斯

@JamesAndino这使它起作用(我看到Giles将其添加到他的回答中。)

6
bind 'RETURN: "\e[1~clear; \e[4~\n"'

之后,每按一次,return而不是仅仅按\n一下,它将移至行的开头,输入文字clear;,然后移至末尾并按\n预期输入。


2
换行符会导致提示始终被打印,因此在提示中添加透明字符可以完成相同的操作,而不会污染命令的历史记录clear
2012年

2
@ jw013的区别在于,在我的情况下clear,该命令是在命令执行之前执行的,并且命令输出不会消失。但是在有提示的情况下会这样做。

我希望有某种方法可以执行此操作而不必修改命令行本身-我相信这会以有趣的方式破坏复杂或多行命令,但是我找不到更好的方法。
2012年

@ jw013,您是对的,它确实会折断多行。.它clear;会在输出中插入多余的内容\n
Peter.O 2012年

这个技巧是非常好的!!我需要将某些特定的代码绑定到F2,但是有时该行中有我键入但未执行的命令,因此使用ex .:bind "\"\\eOQ\":\"\e[1~ls;#\\n\""它将移至开头,键入ls;#注释内容,然后ls正确运行该命令!谢谢!
Aquarius Power

2

从我今天问的一个问题(感谢用户@aecolley的回答):

bind '"\C-m": "\C-l\C-j"'

\C-m模拟“回车”键,\C-l模拟Ctrl+l,因为它是明确的,\C-j就是“换行和缩进”,所以命令结合回车键为Ctrl + L&按Ctrl + J

可以在GNU bash版本3.2.53(1)-release(x86_64-apple-darwin14)上运行,而该线程上的其他答案则不行。同样,这不会每隔一个命令就用“清除”命令污染历史记录。


1
注意:如果通过ssh使用,则必须在该环境中执行它,否则会发生怪异现象。
TRB 2015年

非常好,它可以在我的ubuntu 16.04终端上使用,谢谢,但是它如何工作,请提供链接或一些文档吗?
Andrzej Rehmann

0

仅在需要时考虑清算

cb4() {
  preexec () {
    clear
  }
}

这也使用一个名为的钩子preexec,也可以与zsh一起使用

然后,您要在运行每个命令之前自动清除的任何会话: cb4

如果您确定要始终清除每种情况

preexec () {
  clear
}

如果您确实想重置终端

替换词cleartput reset

tput 是可选的,但可以加快重置过程

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.