Janela do Terminal Principal Exibindo Somente Comandos

1

Muitas vezes eu perco o controle do fluxo de comando devido à saída de texto longo de alguns comandos, então eu gostaria de ter uma janela do terminal principal onde os comandos do usuário são executados e outras janelas do terminal que “pop up” exibe a saída dos comandos e depois são fechados com o uso de um atalho.

É possível codificar esse comportamento? Alguma dica sobre o idioma que devo usar?

Uma interação ainda mais amigável seria para o terminal perguntar se ele deveria exibir a saída externamente se excedesse um limite definido pelo usuário.

    
por Sandro Sivsivadzé 08.09.2017 / 22:29

1 resposta

7

Eu sei pouco sobre linguagens de programação, mas o Bash pode definitivamente configurar para se comportar como você quer, então aqui está como eu faria isso.

Configuração geral

Defina uma função no seu arquivo ~/.bash_aliases ou ~/.bashrc que permita que você inicie seu comando em um novo terminal, por exemplo

foo () { ( xterm -hold -e bash -c "$*" & ) ;}

Dessa forma, foo echo bar abre um novo xterm , que mostra apenas a saída de echo bar , aqui seria uma janela apenas com a palavra bar . Uma cadeia de comandos deve ser citada, e. %código%. Você pode substituir foo "echo bar && echo baz" pelo emulador de terminal de sua escolha, mas você precisa descobrir qual é a opção permanecer aberta - leia a página xterm . A opção man deve funcionar para todos eles. Note que como um nome de função você pode escolher até mesmo um único símbolo como -e , : ou _ ( AltR + , ).

Explicações

  • · - define uma função foo () { … ;} que faz foo
  • - inicia ( … ) em um subshell, isso libera o terminal original para que um novo comando possa ser executado mesmo quando outros terminais de saída ainda estiverem abertos
  • - execute xterm -hold -e … , execute xterm e quando o comando terminar
  • -hold - execute o (s) comando (s) bash -c " … " , necessário para poder executar vários comandos
  • - corresponde a todos os argumentos de $* = a cadeia completa de comandos após foo

Ajuste fino

Fechando a janela do terminal de saída

Você pode fechar o terminal de saída usando o atalho padrão do seu ambiente de desktop para isso - Alt por padrão.

Se você quiser que o terminal de saída permaneça aberto por, digamos, cinco segundos após o comando terminar, você precisa definir a função da seguinte forma:

foo () { ( xterm -e bash -c "$* && sleep 5" & ) ;}

Substitua foo por && para que o terminal permaneça aberto somente até que o comando seja concluído, mas pelo menos cinco segundos.

Facilitação de entrada

Usando & (feia e suja, boo )

Vai incomodar você digitar xdotool antes de cada comando no seu terminal principal, então eu configurei uma solução alternativa para isso - instale foo primeiro se necessário. Quando você abre seu terminal principal, primeiro defina essa variável:

PROMPT_COMMAND='xdotool type "foo "'

Isso automaticamente digitará xdotool seguido por um espaço depois, mas infelizmente também antes de cada novo prompt. Tudo o que você precisa fazer é digitar seu (cadeia de) comando (s).

Usando uma função foo (massivamente legal)

A pergunta sobre como realizar o seguinte foi perguntada no Unix.SE e obteve uma resposta brilhante por < a href="https://unix.stackexchange.com/users/22565/st%C3%A9phane-chazelas"> Stéphane Chazelas , cuja solução é usada aqui. Se isso o ajudar de alguma forma, por favor, visite a questão relacionada e vote a sua resposta.

Adicione as seguintes linhas ao seu arquivo perl e salve-o:

insert() { perl -le 'require "sys/ioctl.ph"; ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV' -- "$@" ;}
auto_enter() { bind $'"\u200b":"'' "'; PROMPT_COMMAND="insert $'\u200b'" ;}

Agora, quando você abrir um novo terminal e executar ~/.bashrc , a string “foo” (com o espaço adicionado automaticamente) aparecerá após cada novo prompt. Se você digitar algo enquanto um comando é executado, “foo” será inserido mesmo antes deste texto.

Interação fácil de usar

Esta versão da função salva a saída em um arquivo temporário, conta suas linhas e pergunta ao usuário se deseja exibi-lo em uma nova janela:

foo () {
  limit=10 # set line limit
  tf=$(mktemp) # create temp file
  "$@" > $tf # execute command, save output in temp file
  lc=$(wc -l < $tf) # get output's line count
  [ $lc -ge $limit ] && # if line count >= limit then
  ( read -p "The output is $lc lines long, do you want to open it in a new window (y/n)? " yn
    case $yn in
        [Yy]* ) xterm -hold -e "cat $tf" & exit;; # open in new window, send to background and exit
        [Nn]* ) cat $tf; exit;; # print output to stdout and exit
        * ) echo "Please answer yes or no.";; # wrong answer
    esac ) || # else
  cat $tf # print output to stdout
}

É claro que isso pode ser muito otimizado e personalizado, mas acho que é um bom começo.

E agora para algo completamente diferente ™

Uma maneira totalmente diferente de atingir seu objetivo é usar o redirecionamento de saída do shell. auto_enter foo fornece uma lista de terminais em execução, por exemplo:

> who
username tty7         2017-09-07 20:46 (:0)
username pts/2        2017-09-07 20:47 (:0)
username pts/1        2017-09-07 21:05 (:0)

Você pode enviar a saída para qualquer um deles simplesmente anexando, por exemplo. who ao seu comando, que obviamente também pode ser usado em uma função como mostrado acima.

As sessões do emulador de terminal do GNOME ( > /dev/pts/1 ) não são exibidas por gnome-terminal , no entanto, os dispositivos who existem igualmente para eles. Você pode determinar as sessões de terminal abertas apenas tentando ou com pts .

    
por dessert 08.09.2017 / 22:58