防止终端显示以前执行的命令

who*_*oes 7 shell bash zsh terminal

我有一个脚本,可以让我在处理项目时记录随机想法。在终端中,我将通过运行添加一个新的日志条目

$ @ "some random thought"
Run Code Online (Sandbox Code Playgroud)

where@只是我脚本的别名。

假设我的终端处于这种状态:

$ ls /var/tmp
somefile.ext
another-file.l
$ _
Run Code Online (Sandbox Code Playgroud)

运行我的脚本后,它看起来像这样:

$ ls /var/tmp
somefile.ext
another-file.l
$ @ "some random thought"
$ _
Run Code Online (Sandbox Code Playgroud)

现在,我不希望该行 ( $ @ "some random thought") 在我输入后停留在屏幕上。我只希望脚本运行并且在屏幕上不留下任何痕迹(有些事情是个人的,有些人可能会看到我的终端)。我也不想clear整个屏幕。

你认为这可能吗?如果有帮助,我正在使用Iterm2

注意:我知道如何处理history以便它不会记录我的日志条目。我只想在屏幕上不留下任何痕迹。

Sté*_*las 7

您可以为此定义一个小部件,而不是使用命令来输入您的想法。在zsh

thought() { 
  print -r -- $BUFFER >> ~/.thoughts
  # or: your-script $BUFFER
  BUFFER=
  zle -M 'thought recorded'
}
zle -N thought
bindkey '^T' thought
Run Code Online (Sandbox Code Playgroud)

然后按Ctrl-T将缓冲区的内容添加到您的~/.thoughts文件中,然后将其清除 ( BUFFER=)。然后,您不必担心引用。

另一种方法是使用交互式评论:

setopt interactive_comments
alias '@=:;#'
preexec() {
  [[ $1 = @* ]] && {
    print -r -- ${1#* } >> ~/.thoughts
    # or: your-script ${1#* }
    echoti cuu1
  }
}
Run Code Online (Sandbox Code Playgroud)

同样,引用没有问题,但这仅适用于单行想法。(echoti cuu1通过向上移动光标来清除该行)。


Ale*_*ios 6

警告,这是一个可怕的、可怕的黑客(但是,整个请求有点像黑客)。:)

这里有一些可以在大多数终端上工作的东西,包括脑残的 MS-DOS 'ANSI.SYS' 模拟器。当然不会在哑终端上工作(但什么都不会):

tput sc
echo "This will be hidden."
sleep 5
tput rc; tput cuu 1; tput ed
Run Code Online (Sandbox Code Playgroud)

显然,这是一个例子。去掉echoandsleep并用你的命令替换它。这是它的工作原理:

  • tput sc 在屏幕上保存光标的当前坐标,
  • tput rc将光标移回存储的坐标。现在,屏幕可能已经滚动,因此敏感内容将位于已保存内容的上方。所以,
  • tput cuu 1将光标向上移动一行。(如果你觉得特别偏执,可以随意增加数量。
  • 最后,tput ed清除到屏幕的末尾(即从光标清除到行尾,然后从光标清除到屏幕底部)。

如果屏幕滚动很多,这将失败,因为sc不知道滚动,只知道屏幕坐标。

tput与终端无关,因此只要您的特定终端在 terminfo 数据库中列出并且TERM变量设置正确,它就可以工作。


jme*_*etz 4

您可以尝试覆盖上一行,该行已经得到答复;

如何更改终端上一行的内容而不是编写新的内容?

例如(根据原始答案修改):

prompt% echo -n "Old line"; echo "\033[1A\033[1A" "new line"
Run Code Online (Sandbox Code Playgroud)

只会显示:

prompt% new line
Run Code Online (Sandbox Code Playgroud)

作为输出。添加更多 \033[1A 序列会删除更多行。

警告:这并不适用于所有终端。