Par mesure préventive pour l'inconvénient d'avoir à appuyer sur CTRL- z, vous pouvez créer un script wrapper pour votre éditeur sur lequel exécuter votre éditeur en arrière-plan. De cette façon, vous n'auriez pas besoin de vous souvenir de le démarrer en arrière-plan explicitement:
#!/bin/sh
EDITOR="emacs" # or whatever
if [ -z "${DISPLAY}" ]; then
${EDITOR} "$@"
else
${EDITOR} "$@" &
fi
Ci-dessus, nous essayons d'abord de déterminer si vous avez un serveur X disponible et d'exécuter l'éditeur en arrière-plan (sinon, de nombreux éditeurs Unix utiliseront votre terminal à la place et vous ne voulez pas exécuter l'éditeur en tant que processus d'arrière-plan dans ce cas) . Il passera tous les arguments à votre éditeur de choix verbatim ( "$@"
) comme vous l'avez fourni pour le script wrapper.
Quant à la commande qui vous manque ... Selon mon expérimentation de base, pour les programmes GUI qui n'impliquent pas de terminal, cela pourrait être aussi simple que d'envoyer d'abord SIGSTOP
puis SIGCONT
au processus de premier plan (en utilisant la kill
commande si vous utilisez un script shell pour l'implémenter) . Vous auriez bien sûr besoin de l'exécuter dans une autre fenêtre / onglet de terminal, et la difficulté serait de trouver de manière pratique et générique le PID auquel vous souhaitez envoyer votre signal. Vous pouvez par défaut envoyer les deux signaux à tous les processus du nom donné (par défaut à votre éditeur préféré et autorisant également l'utilisation des PID comme arguments):
#!/bin/sh
EDITOR=emacs # whatever
stop_cont_prog()
{
case "$1" in
# begin with number is considered PID - this is not good
# enough to be taken seriously...
[1-9]*) kill -SIGSTOP "$1"; kill -SIGCONT "$2";;
*) killall -SIGSTOP "$1"; killall -SIGCONT "$2";;
esac
}
if [ -n "$1" ]; then
for prog in "$@"; do stop_cont_prog "$1"; done
else
stop_cont_prog "${EDITOR}"
fi
Cette méthode m'a correctement donné mes onglets de terminal après avoir exécuté (plusieurs) emacs
commandes en arrière-plan. Mais le processus emacs en cours d'exécution dans le terminal n'a pas été correctement restauré en raison du contrôle du travail du shell ou de la confusion des paramètres du terminal. Cette méthode bénéficierait donc d'une certaine sophistication.
C'est SIGSTOP
exactement ce qui est envoyé au processus de premier plan lorsque vous appuyez sur (par défaut commun) CTRL- z. Se référer à la stty -a
sortie
$ stty -a
speed 38400 baud; rows 50; columns 200; line = 0;
intr = ^C; [...] start = ^Q; stop = ^S; susp = ^Z; [...]
[...]
(sortie abrégée) et stty
page de manuel:
susp CHAR
CHAR will send a terminal stop signal
Les processus arrêtés à l'aide du SIGSTOP
signal peuvent être redémarrés en envoyant SIGCONT
. Normalement, c'est la logique de contrôle du travail du shell qui enverra SIGCONT
et prendra en charge les autres manipulations nécessaires impliquées avec les commandes fg
et bg
que nous ignorerons.
tmux
donne peut-être les mêmes fonctionnalités que souhaité dans votre question.