Evitar que o terminal exiba o comando executado anteriormente

7

Eu tenho um script que me permite registrar pensamentos aleatórios enquanto trabalho em um projeto. No terminal eu adicionaria uma nova entrada de log executando

$ @ "some random thought"

onde @ é apenas um alias para o meu script.

Digamos que meu terminal esteja nesse estado:

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

Depois de executar meu script, ficaria assim:

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

Agora, não quero que a linha ( $ @ "some random thought" ) permaneça na tela depois que eu a inseri. Eu só quero que o script seja executado e não deixe rastros na tela (algumas coisas são pessoais e algumas pessoas podem ver meu terminal). Eu também não quero clear a tela inteira.

Você acha que isso é possível? Estou usando o Iterm2 se isso ajudar.

NB: Eu sei como lidar com history para que não grave minhas entradas de log. Eu só não quero deixar vestígios na tela.

    
por whonoes 17.12.2013 / 12:36

4 respostas

4

Você pode tentar sobrescrever a linha anterior, que já foi respondida;

Como alterar o conteúdo de uma linha no terminal em vez de escrever uma nova?

Por exemplo (modificado da resposta original):

prompt% echo -n "Old line"; echo "3[1A3[1A" "new line"

Será exibido apenas:

prompt% new line

como a saída. Adicionando mais \ 033 [seqüências 1A remove mais linhas.

Caveat : Isso não funciona em todos os terminais.

    
por 17.12.2013 / 12:38
7

Em vez de ter um comando para inserir seu pensamento, você pode definir um widget para isso. Em zsh :

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

Em seguida, pressione Ctrl-T para adicionar o conteúdo do buffer ao arquivo ~/.thoughts e depois desmarque-o ( BUFFER= ). Então, você não precisa se preocupar com citações.

Outra abordagem poderia ser usar comentários interativos:

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

Novamente, não há problema em citar, mas isso só funciona para pensamentos de linha única. (o echoti cuu1 cuida de limpar essa linha movendo o cursor para cima).

    
por 17.12.2013 / 13:41
6

Atenção, este é um horrível e horrível hack (mas o pedido inteiro é um pouco hackeado). :)

Aqui está algo que funcionará nos terminais mais , incluindo o emulador "ANSI.SYS" do MS-DOS. Não vai funcionar em terminais burros, é claro (mas nada vai):

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

Obviamente, este é um exemplo. Livre-se dos echo e sleep e substitua-os pelo seu comando. Veja como funciona:

  • tput sc salva as coordenadas atuais do cursor na tela,
  • tput rc move o cursor de volta para as coordenadas armazenadas. Agora, a tela pode ter rolado, então o material sensível estará na linha acima da que foi salva. Então,
  • tput cuu 1 move o cursor uma linha para cima. (se você se sentir especialmente paranóico, sinta-se à vontade para aumentar o número.
  • Finalmente, tput ed limpa até o final da tela (ou seja, limpa do cursor até o final da linha e, em seguida, do cursor até a parte inferior da tela).

Isso falhará comicamente se a tela rolar muito porque sc não sabe sobre rolagem, apenas coordenadas de tela.

tput é terminal-agnóstico, então funcionará desde que seu terminal específico esteja listado no banco de dados terminfo e a variável TERM esteja configurada corretamente.

    
por 17.12.2013 / 14:43
0

Bem, se for apenas some random thought em vez do comando real, você poderá adicionar space antes do thought . Isso excluirá esse comando de entrar no histórico

satish@Satish:/tmp $ echo "I'm in history"
I'm in history
satish@Satish:/tmp $  echo "I'm not"
I'm not
satish@Satish:/tmp $ history | tail -n 3
 1887  sudo su -
 1888  echo "I'm in history"
 1889  history | tail -n 3
satish@Satish:/tmp $ 
    
por 17.12.2013 / 12:43