Prefiero iniciar aplicaciones GUI desde una ventana de terminal en lugar de usar un escritorio gráfico. Una molestia frecuente es que a menudo los desarrolladores no han anticipado este tipo de uso, por lo que la aplicación imprime muchos mensajes inútiles, crípticos o poco informativos en stdout o stderr. Se produce un mayor desorden en el terminal porque ejecutar el programa en segundo plano, con un &, genera informes de la creación y finalización del trabajo.
¿Cuál es la solución para estos problemas que aceptarán argumentos de la línea de comandos y manejarán el autocompletado?
Relacionado: /programming/7131670/make-bash-alias-that-takes-parameter
fuente
$DISPLAY
que no está configurado (por ejemplo, si el usuario olvidó un-X
for ssh) o un problema de autorización X como aquí: 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 &
(el punto más importante fue la idea, no la implementación real).Esta respuesta es para bash. Como ejemplo, esto es lo que hago en mi .bashrc para hacer un comando conveniente
ev
para iniciar el visor de PDF Evince.La primera línea define una función
ev
. El nombre de una función se reconocerá cuando la use en la línea de comando de esta manera:(Este es un mecanismo diferente que los alias, y tiene menor prioridad). La salida de Evince a stdin y stdout se envía al bitbucket (/ dev / null). El signo comercial pone el trabajo en segundo plano. Rodear el comando entre paréntesis hace que se ejecute en una subshell para que no imprima mensajes sobre la creación del trabajo en segundo plano o su finalización.
La segunda línea de mi .bashrc usa la función completa de bash para decirle a bash que se espera que el argumento del comando ev sea un archivo con la extensión pdf. Esto significa que si también tengo archivos foo.tex, foo.aux, etc., en mi directorio, puedo escribir
ev foo
y presionar la tecla de tabulación, y bash sabrá completar el nombre de archivo como foo.pdf.fuente
ev() (evince "$@" >&2 &) 2>/dev/null
ev() (evince "$@" &>/dev/null $)
&
.Otra posibilidad es usar
command
para degradarexec
de una construcción especial a una construcción simple como:Entonces ahora puedes hacer:
Acabo de notar que
command
no funcionazsh
(como parece hacerlo en la mayoría de los otros shells) , pero donde no funciona, puede hacerlo:... que debería funcionar en todas partes.
De hecho, incluso podrías hacer:
Entonces podrías hacer:
SALIDA
Después de una discusión de comentarios con @ vinc17, vale la pena señalar que casi toda la salida de la consola de una aplicación GUI generalmente está destinada a
X
su consola. Cuando ejecuta unaX
aplicación desde unX
.desktop
archivo, la salida que genera se enruta aX
la terminal virtual, que es cualquier cosa desde la que se inicióX
en primer lugar. Puedo abordar este número tty con$XDG_VTNR
.Aunque parezca extraño, y tal vez porque recién comencé a usarlo
startx
, parece que ya no puedo escribirle/dev/tty$XDG_VTNR
. Esto también puede (como creo que es más probable) tener algo que ver con el cambio muy reciente y drástico implementado conXorg
v1.16 que le permite ejecutarse bajo unasystemd
sesión de usuario en lugar de requerir privilegios de root .Aún así, puedo hacer:
Ahora toda
some x app
la salida de la consola se enruta en/dev/tty$((1+$XDG_VTNR))
lugar de la de mixterm
pty. Puedo obtener la última página de esto en cualquier momento como:Probablemente sea la mejor práctica dedicar algún terminal virtual para registrar la salida de todos modos.
/dev/console
generalmente ya está reservado para esto, aunque es posible que prefiera no hacer lochown
que es probable que tenga que escribir alegremente. Es posible que tenga alguna función que le permita hacerprintk
, que básicamente es imprimir en/dev/console
, y, por lo tanto, podría usarlo de esa manera, supongo.Otra forma de hacer esto sería dedicar una piedad a tales propósitos. Podría, por ejemplo, mantener una
xterm
ventana abierta, guardar la salida detty
cuando se ejecuta desde allí en una variable de entorno y usar ese valor como destino paragui
la salida de. De esa manera, todos los registros se enrutarían a una ventana de registro separada, que luego podría desplazarse si lo desea.Una vez escribí una respuesta sobre cómo se podría hacer algo similar con la
bash
historia, si estás interesado.fuente
echo $?
ya que agrega información inútil y se basa en un error en bash, que acabo de informar aquí: lists.gnu.org/archive/html/bug-bash/2014- 08 / msg00081.html y en Debian BTS: bugs.debian.org/cgi-bin/bugreport.cgi?bug=758969