Je préfère lancer des applications GUI à partir d'une fenêtre de terminal plutôt qu'en utilisant un bureau graphique. Une gêne fréquente est que souvent les développeurs n'ont pas anticipé ce type d'utilisation, donc l'application imprime beaucoup de messages inutiles, cryptiques ou non informatifs sur stdout ou stderr. Un encombrement supplémentaire sur le terminal se produit car l'exécution du programme en arrière-plan, avec un &, génère des rapports sur la création et la fin du travail.
Quelle est une solution de contournement pour ces problèmes qui acceptera les arguments de ligne de commande et gérera la saisie semi-automatique?
En relation: /programming/7131670/make-bash-alias-that-takes-parameter
la source
$DISPLAY
n'est pas défini (par exemple si l'utilisateur a oublié un-X
pour ssh) ou à un problème d'autorisation X comme ici: 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 &
(le point le plus important était l'idée, pas la mise en œuvre réelle).Cette réponse est pour bash. Par exemple, voici ce que je fais dans mon .bashrc pour créer une commande pratique
ev
pour démarrer la visionneuse PDF Evince.La première ligne définit une fonction
ev
. Le nom d'une fonction sera reconnu lorsque vous l'utiliserez sur la ligne de commande comme ceci:(Il s'agit d'un mécanisme différent de celui des alias, et il a une priorité inférieure.) La sortie d'Evince vers stdin et stdout est envoyée au bitbucket (/ dev / null). L'esperluette met le travail en arrière-plan. Entourer la commande entre parenthèses provoque son exécution dans un sous-shell afin qu'il n'imprime pas de messages sur la création du travail d'arrière-plan ou son achèvement.
La deuxième ligne de mon .bashrc utilise la fonction complète de bash pour dire à bash que l'argument de la commande ev devrait être un fichier avec l'extension pdf. Cela signifie que si j'ai également des fichiers foo.tex, foo.aux, etc., assis dans mon répertoire, je peux taper
ev foo
et appuyer sur la touche de tabulation, et bash saura compléter le nom de fichier en foo.pdf.la source
ev() (evince "$@" >&2 &) 2>/dev/null
ev() (evince "$@" &>/dev/null $)
&
.Une autre possibilité est d'utiliser
command
pour rétrograderexec
d'un builtin spécial à un vieux buildin simple comme:Alors maintenant, vous pouvez faire:
Je viens de remarquer que
command
cela ne fonctionne paszsh
(comme cela semble le faire dans la plupart des autres shells) , mais où cela ne fonctionne pas, vous pouvez le faire à la place:... qui devrait fonctionner partout.
En fait, vous pourriez même faire:
Vous pourriez donc faire:
PRODUCTION
Suite à une discussion de commentaires avec @ vinc17, il convient de noter que la quasi-totalité de la sortie de la console d'une application GUI est généralement destinée à
X
tty - sa console. Lorsque vous exécutez uneX
application à partir d'unX
.desktop
fichier, la sortie qu'elle génère est routée versX
le terminal virtuel de - c'est-à-dire quel que soit le terminal à partir duquel vous avez lancéX
en premier lieu. Je peux adresser ce numéro tty avec$XDG_VTNR
.Curieusement cependant - et peut-être parce que je viens de commencer à utiliser
startx
- je n'arrive plus à écrire/dev/tty$XDG_VTNR
. Cela peut également (comme je pense que c'est plus probable) avoir quelque chose à voir avec le changement très récent et radical implémenté avec laXorg
v1.16 qui lui permet de s'exécuter sous unesystemd
session utilisateur plutôt que de nécessiter des privilèges root .Pourtant, je peux faire:
Maintenant tout
some x app
la sortie de la console est routée vers/dev/tty$((1+$XDG_VTNR))
plutôt que la miennexterm
. Je peux obtenir la dernière page de ceci à tout moment comme:Il est probablement préférable de dédier un terminal virtuel à la sortie de journal de toute façon.
/dev/console
est généralement déjà réservé pour cela, bien que vous préfériez ne pas faire cechown
qui est probablement nécessaire pour que vous écriviez allègrement à cela. Vous pouvez avoir une fonction qui vous permet de faire unprintk
- qui est essentiellement une impression vers/dev/console
- et pourrait donc l'utiliser de cette façon, je suppose.Une autre façon de le faire serait de dédier un pty à ces fins. Vous pouvez, par exemple, garder une
xterm
fenêtre ouverte, enregistrer la sortie detty
lorsqu'elle est exécutée à partir de là dans une variable d'environnement et utiliser cette valeur comme destination pourgui
la sortie de. De cette façon, tous les journaux seraient acheminés vers une fenêtre de journal distincte, que vous pourriez ensuite parcourir si vous le souhaitez.J'ai écrit une fois une réponse sur la façon dont une chose similaire pourrait être faite avec l'
bash
histoire, si cela vous intéresse.la source
echo $?
car elle ajoute des informations inutiles et elle est basée sur un bogue dans bash, que je viens de signaler ici: lists.gnu.org/archive/html/bug-bash/2014- 08 / msg00081.html et dans le BTS Debian: bugs.debian.org/cgi-bin/bugreport.cgi?bug=758969