92 votes

Comment démarrer des programmes linux GUI à partir de la ligne de commande, mais séparément de la ligne de commande ?

J'ai déjà cherché cette question, mais je n'ai jamais pu trouver de réponse.

Dans Windows, si j'ai une fenêtre de console ouverte, tapez winmine et appuyez sur Entrée, Minesweeper apparaîtra, complètement séparé du programme cmd. L'instance de Minesweeper n'est pas liée à l'invite de commande de quelque manière que ce soit, à l'exception du parent de Minesweeper qui est défini à cette instance de l'invite de commande. C'est différent sous Linux, cependant.

Sous Linux, si j'ai une fenêtre de console ouverte, je tape emacs et appuyez sur entrée, Emacs s'ouvre, mais il semble lié à la ligne de commande. Plus précisément, il semble que je ne puisse plus utiliser la ligne de commande tant que cette instance d'Emacs n'est pas fermée. Existe-t-il un moyen de reproduire le comportement de Windows sous Linux ?

Merci !

3voto

Idham Perdameian Points 131

Vous pouvez utiliser cette seule ligne :

$ emacs & disown

0voto

Dan D. Points 5666

Juste en utilisant & dans le cas de $ x & laisse le processus attaché au terminal, j'ai récupéré un petit programme appelé detach http://inglorion.net/software/detach/ que j'ai aliasé comme d c'est un peu comme nohup mais ne laisse pas derrière lui de fichier journal, je l'utilise pour détacher mupdf : d mupdf x.pdf

0voto

midenok Points 240

Mettez cela à votre ~/.bashrc :

debug_trap_skip()
{
    local cmd_type=$(type -t "$1")

    # Empty cmd_type is for inexistent command or variable definition, exclude them
    # and shell builtins except echo, set and env:
    [[ -z "$cmd_type" || "$cmd_type" = builtin && "$1" != echo && "$1" != set && "$1" != env ]] &&
        return 0

    return 1
}

debug_trap_x11()
{
    if ldd `which $1`|grep -q libX11
    then
        setsid "$@"
        return 0
    fi
    return 1
}

debug_trap()
{
    [[ -n "$COMP_LINE" ]] && return  # do nothing if completing
    [[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ]] && return
    debug_trap_skip $BASH_COMMAND && return 0
    debug_trap_x11 $BASH_COMMAND && return 1

    return 0
}

shopt -s extdebug
trap debug_trap DEBUG

Désormais, vous n'avez plus à vous souvenir des programmes X11 et à effectuer des manipulations spéciales pour eux, car ils se détachent automatiquement. Notez que setsid est meilleur que nohup parce que le dernier bloque le signal HUP, ce qui n'est pas ce dont vous avez besoin.

P.S. Maintenant vous êtes winmine -prêt pour Linux.

0voto

Joachim W Points 101

Si rien de ce qui précède ne fonctionne parce que DISPLAY n'est pas défini, alors utilisez

(xvfb-run &)

Pour une explication, voir https://superuser.com/a/1681455/269343 .

-3voto

Vous pouvez exécuter n'importe quelle application en arrière-plan afin qu'elle ne soit pas liée au terminal. Il suffit de mettre une esperluette après la commande.

emacs &

Cela lancera emacs mais ne le liera pas au terminal. J'espère que cela vous aidera !

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X