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çãofoo () { … ;}
que fazfoo
-
…
- 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 -
…
- executexterm -hold -e …
, executexterm
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ósfoo
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
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
.