Prefiro iniciar aplicativos GUI a partir de uma janela do terminal, em vez de usar uma área de trabalho gráfica. Um aborrecimento frequente é que, muitas vezes, os desenvolvedores não antecipam esse tipo de uso; portanto, o aplicativo imprime muitas mensagens inúteis, enigmáticas ou pouco informativas para stdout ou stderr. Mais confusão no terminal ocorre porque a execução do programa em segundo plano, com um &, gera relatórios da criação e finalização do trabalho.
Qual é uma solução alternativa para esses problemas que aceitam argumentos de linha de comando e manipulam o preenchimento automático?
Relacionado: /programming/7131670/make-bash-alias-that-takes-parameter
fonte
$DISPLAY
não está definido (por exemplo, se o usuário esqueceu um-X
para ssh) ou um problema de autorização X como aqui: unix.stackexchange.com/questions/108679/…"$@" 2>&1 | { quit=$(($(date +%s)+5)); while read line && [ $(date +%s) -lt $quit ]; do printf "[%s] %s\n" "$(date +%T)" "$line"; done; } | head -n 10 &
(o ponto mais importante foi a ideia, não a implementação real).Esta resposta é para bash. Como exemplo, eis o que eu faço no meu .bashrc para fazer um comando de conveniência
ev
para iniciar o visualizador de PDF Evince.A primeira linha define uma função
ev
. O nome de uma função será reconhecido quando você a usar na linha de comando desta maneira:(Este é um mecanismo diferente dos aliases e tem prioridade mais baixa.) A saída do Evince para stdin e stdout é enviada para o bitbucket (/ dev / null). Oe comercial coloca o trabalho em segundo plano. Colocar o comando entre parênteses faz com que ele seja executado em um subshell, para que não imprima mensagens sobre a criação do trabalho em segundo plano ou sua conclusão.
A segunda linha do meu .bashrc usa a função completa do bash para informar ao bash que se espera que o argumento do comando ev seja um arquivo com a extensão pdf. Isso significa que, se eu também tiver os arquivos foo.tex, foo.aux, etc., no meu diretório, posso digitar
ev foo
e pressionar a tecla tab, e o bash saberá concluir o nome do arquivo como foo.pdf.fonte
ev() (evince "$@" >&2 &) 2>/dev/null
ev() (evince "$@" &>/dev/null $)
&
.Outra possibilidade é usar
command
para rebaixarexec
de um embutido especial para um embutido antigo simples como:Então agora você pode fazer:
Acabei de perceber que
command
isso não funcionazsh
(como parece acontecer na maioria das outras conchas) , mas onde não funciona, você pode:... o que deve funcionar em qualquer lugar.
De fato, você pode até fazer:
Então você poderia fazer:
RESULTADO
Após uma discussão de comentários com o @ vinc17, vale a pena notar que quase toda a saída do console de um aplicativo GUI geralmente se destina ao
X
styty - seu console. Quando você executa umX
aplicativo a partir de umX
.desktop
arquivo, a saída gerada é roteada paraX
o terminal virtual - que é o tty de onde você iniciouX
. Eu posso endereçar esse número tty com$XDG_VTNR
.Estranhamente - e talvez porque eu comecei a usar
startx
- não consigo mais escrever/dev/tty$XDG_VTNR
. Isso também pode (como eu acho mais provável) ter algo a ver com as mudanças drásticas e recentes recentes implementadas naXorg
v1.16, que permitem que ela seja executada em umasystemd
sessão de usuário em vez de exigir privilégios de root .Ainda assim, eu posso fazer:
Agora, toda
some x app
a saída do console está sendo encaminhada para o pty/dev/tty$((1+$XDG_VTNR))
do meuxterm
. Posso obter a última página disso a qualquer momento, como:Provavelmente, é uma boa prática dedicar algum terminal virtual para registrar a saída de qualquer maneira.
/dev/console
geralmente já está reservado para isso, embora você possa preferir não fazer ochown
que é provavelmente necessário para que você possa escrever alegremente. Você pode ter alguma função que permite fazerprintk
- o que é basicamente imprimir/dev/console
- e, portanto, poderia usá-lo dessa maneira, suponho.Outra maneira de fazer isso seria dedicar um pty a esses propósitos. Você pode, por exemplo, manter uma
xterm
janela aberta, salvar a saídatty
quando executada a partir daí em uma variável de ambiente e usar esse valor como destino dagui
saída da. Dessa forma, todos os logs seriam roteados para uma janela de log separada, que você poderia percorrer se quisesse.Certa vez, escrevi uma resposta sobre como algo semelhante poderia ser feito com a
bash
história, se você estiver interessado.fonte
echo $?
pois ele adiciona informações inúteis e se baseia em um bug no bash, que acabei de relatar aqui: lists.gnu.org/archive/html/bug-bash/2014- 08 / msg00081.html e no Debian BTS: bugs.debian.org/cgi-bin/bugreport.cgi?bug=758969