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

$DISPLAYque no está configurado (por ejemplo, si el usuario olvidó un-Xfor 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
evpara 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 fooy presionar la tecla de tabulación, y bash sabrá completar el nombre de archivo como foo.pdf.fuente
ev() (evince "$@" >&2 &) 2>/dev/nullev() (evince "$@" &>/dev/null $)&.Otra posibilidad es usar
commandpara degradarexecde una construcción especial a una construcción simple como:Entonces ahora puedes hacer:
Acabo de notar que
commandno 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
Xsu consola. Cuando ejecuta unaXaplicación desde unX.desktoparchivo, la salida que genera se enruta aXla terminal virtual, que es cualquier cosa desde la que se inicióXen 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 conXorgv1.16 que le permite ejecutarse bajo unasystemdsesión de usuario en lugar de requerir privilegios de root .Aún así, puedo hacer:
Ahora toda
some x appla salida de la consola se enruta en/dev/tty$((1+$XDG_VTNR))lugar de la de mixtermpty. 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/consolegeneralmente ya está reservado para esto, aunque es posible que prefiera no hacer lochownque 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
xtermventana abierta, guardar la salida dettycuando se ejecuta desde allí en una variable de entorno y usar ese valor como destino paraguila 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
bashhistoria, 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