Bash

防止終端顯示以前執行的命令

  • December 17, 2013

我有一個腳本,可以讓我在處理項目時記錄隨機想法。在終端中,我將通過執行添加一個新的日誌條目

$ @ "some random thought"

where@只是我的腳本的別名。

假設我的終端處於這種狀態:

$ ls /var/tmp
somefile.ext
another-file.l
$ _

執行我的腳本後,它看起來像這樣:

$ ls /var/tmp
somefile.ext
another-file.l
$ @ "some random thought"
$ _

現在,我不希望那行 ( $ @ "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

然後按Ctrl-T將緩衝區的內容添加到您的~/.thoughts文件中,然後將其清除 ( BUFFER=)。然後,您不必擔心引用。

另一種方法是使用互動式評論:

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

同樣,引用沒有問題,但這僅適用於單行思想。(echoti cuu1通過向上移動游標來清除該行)。

警告,這是一個可怕的、可怕的 hack(但是,整個請求有點像 hack)。:)

這是適用於大多數終端的東西,包括腦殘的 MS-DOS ‘ANSI.SYS’ 模擬器。當然,不會在啞終端上工作(但什麼都不會):

tput sc
echo "This will be hidden."
sleep 5
tput rc; tput cuu 1; tput ed

顯然,這是一個例子。擺脫echoandsleep並用您的命令替換它。以下是它的工作原理:

  • tput sc保存游標在螢幕上的目前座標,
  • tput rc將游標移回儲存的座標。現在,螢幕可能已經滾動,所以敏感的東西會在保存的上面一行。所以,
  • tput cuu 1將游標向上移動一行。(如果您覺得特別偏執,請隨意增加數字。
  • 最後,tput ed清除到螢幕末尾(即從游標清除到行尾,然後從游標清除到螢幕底部)。

如果螢幕滾動很多,這將失敗,因為sc不知道滾動,只知道螢幕座標。

tput與終端無關,因此只要您的特定終端列在 terminfo 數據庫中並且TERM變數設置正確,它就可以工作。

引用自:https://unix.stackexchange.com/questions/105538