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
以便它不会记录我的日志条目。我只想在屏幕上不留下任何痕迹。
您可以为此定义一个小部件,而不是使用命令来输入您的想法。在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
通过向上移动光标来清除该行)。
警告,这是一个可怕的、可怕的黑客(但是,整个请求有点像黑客)。:)
这里有一些可以在大多数终端上工作的东西,包括脑残的 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)
显然,这是一个例子。去掉echo
andsleep
并用你的命令替换它。这是它的工作原理:
tput sc
在屏幕上保存光标的当前坐标,tput rc
将光标移回存储的坐标。现在,屏幕可能已经滚动,因此敏感内容将位于已保存内容的上方。所以,tput cuu 1
将光标向上移动一行。(如果你觉得特别偏执,可以随意增加数量。tput ed
清除到屏幕的末尾(即从光标清除到行尾,然后从光标清除到屏幕底部)。如果屏幕滚动很多,这将失败,因为sc
不知道滚动,只知道屏幕坐标。
tput
与终端无关,因此只要您的特定终端在 terminfo 数据库中列出并且TERM
变量设置正确,它就可以工作。
您可以尝试覆盖上一行,该行已经得到答复;
例如(根据原始答案修改):
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 序列会删除更多行。
警告:这并不适用于所有终端。