Jako środek zapobiegawczy związany z niedogodnością związaną z koniecznością naciskania CTRL- zmożesz utworzyć skrypt opakowujący dla swojego edytora, który uruchamiałby twój edytor w tle. W ten sposób nie będziesz musiał pamiętać o uruchomieniu go w tle:
#!/bin/sh
EDITOR="emacs" # or whatever
if [ -z "${DISPLAY}" ]; then
${EDITOR} "$@"
else
${EDITOR} "$@" &
fi
Powyżej próbujemy najpierw ustalić, czy masz dostępny serwer X, a dopiero potem uruchomić edytor w tle (jeśli nie, wielu edytorów uniksowych zamiast tego użyje twojego terminala i w tym przypadku nie chcesz uruchamiać edytora jako procesu w tle) . Prześle wszystkie argumenty do edytora wyboru verbatim ( "$@"
), tak jak podałeś dla skryptu opakowania.
Jeśli chodzi o polecenie, którego brakuje ... Na podstawie mojego podstawowego eksperymentu, dla programów GUI, które nie wymagają terminala, może to być tak proste, jak najpierw wysłanie, SIGSTOP
a następnie SIGCONT
przejście do pierwszego planu (użycie kill
polecenia, jeśli używasz skryptu powłoki, aby to zaimplementować) . Oczywiście musiałbyś uruchomić go w innym oknie / zakładce terminala, a trudność polegałaby na wygodnym i ogólnym znalezieniu PID, do którego chcesz wysłać swój sygnał. Możesz domyślnie wysłać dwa sygnały do wszystkich procesów o podanej nazwie (domyślnie do twojego ulubionego edytora i pozwalając również używać PID jako argumentów):
#!/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
Ta metoda poprawnie dała mi karty terminalu po uruchomieniu (kilku) emacs
poleceń w tle. Ale proces emacs działający w terminalu nie został poprawnie przywrócony z powodu kontroli zadań powłoki lub pomyłki w ustawieniach terminala. Ta metoda skorzystałaby z pewnego wyrafinowania.
To SIGSTOP
jest dokładnie to, co jest wysyłane do procesu pierwszego planu po naciśnięciu (według typowych ustawień domyślnych) CTRL- z. Sprawdź stty -a
dane wyjściowe
$ stty -a
speed 38400 baud; rows 50; columns 200; line = 0;
intr = ^C; [...] start = ^Q; stop = ^S; susp = ^Z; [...]
[...]
(wyjście skrócone) i stty
strona podręcznika:
susp CHAR
CHAR will send a terminal stop signal
Procesy zatrzymane za pomocą SIGSTOP
sygnału można ponownie uruchomić, wysyłając SIGCONT
. Zwykle jest to logika kontroli zadania powłoki, która wyśle SIGCONT
i zajmie się innymi niezbędnymi manipulacjami fg
i bg
poleceniami, które ignorujemy.
tmux
zapewnia taką samą funkcjonalność, jak pożądana w pytaniu.