Śledzę ten schemat zawieszania zadania, a następnie pozwalam mu zbyt często kontynuować Ctrl-Z bgsekwencję.
Zastanawiałem się, czy jest jakiś sposób na skompresowanie tego do pojedynczego naciśnięcia klawisza?
Moja skorupa jest zsh
Śledzę ten schemat zawieszania zadania, a następnie pozwalam mu zbyt często kontynuować Ctrl-Z bgsekwencję.
Zastanawiałem się, czy jest jakiś sposób na skompresowanie tego do pojedynczego naciśnięcia klawisza?
Moja skorupa jest zsh
Odpowiedzi:
Ctrl+ ZSekwencji obsługiwane przez terminal nie przez powłokę. (Przydatne tło: Jaka jest dokładna różnica między „terminalem”, „powłoką”, „tty” i „konsolą”? )
Tylko niewielki, nierozszerzalny zestaw funkcji można przypisać do klawisza w terminalu . Można dostosować klawisze powiązane z tymi funkcjami, ale nie można dodawać innej funkcji. Funkcje te dzielą się na trzy kategorie:
eof
, Ctrl+ D), koniec linii ( eol
, Ctrl+ M), usuń znak w lewo ( erase
, Ctrl+ H), usuń słowo w lewo ( werase
, Ctrl+ W), usuń wiersz ( kill
, Ctrl+ U).stop
( Ctrl+ S), start
( Ctrl+ Q). Przydatny tylko w przypadku starych terminali szeregowych, które upuszczały znaki, gdy terminal nie był w stanie nadążyć za komputerem lub odwrotnie.intr
, Ctrl+ C), wymuszenie wyjścia ( quit
, Ctrl+ \), zawieszenie ( Ctrl+ Z).Niektóre systemy, w tym Linux, rozszerzają tę listę, ale nigdy nie widziałem takiego zawierającego tło. Zauważ, że wymagałoby to obsługi zarówno w sterowniku terminala w jądrze, jak i w emulatorze terminala. Musisz więc zadowolić się zawieszeniem, które wysyła do zadania pierwszego planu sygnał SIGTSTP . To uruchamia SIGCHLD w procesie nadrzędnym lidera zadania na pierwszym planie, którym jest zwykle powłoka. Gdy powłoka otrzymała SIGCHLD, wywołuje, waitpid
aby dowiedzieć się, dlaczego została powiadomiona, a po wykryciu, że zadanie w tle zostało zawieszone, wyświetla powiadomienie (np. [1] + 12345 suspended mycommand
) I nowy monit.
Możesz zaprogramować powłokę, aby wysyłała SIGCONT
sygnał do zadania na pierwszym planie. Nie sądzę, aby zsh miał do tego haczyk, trzeba by załatać kod źródłowy. I nie ma sposobu, aby zsh wiedział, czy naprawdę chciałeś przerwać program (ups, ten program może robić coś złego, pozwól mi go zawiesić na czas rozwiązywania) lub w tle.
To, co robię, to ustawić sekwencję klawiszy Ctrl+ Zw Zsh, aby ustawić tło dla bieżącego zadania ( %%
). W ten sposób mogę wysłać zadanie pierwszoplanowe do tła, naciskając Ctrl+ Z Ctrl+ Z. W tym momencie robię Ctrl+ Zcoś innego, co jest użyteczne, gdy bieżący wiersz wejściowy nie jest pusty (więc nie wróciłem z podprocesu): „zawieszam” bieżący wiersz wejściowy, pozwalając mi wpisać inne polecenie , po czym przerywana linia jest ponownie umieszczana w buforze wejściowym.
fancy-ctrl-z () {
if [[ $#BUFFER -eq 0 ]]; then
bg
zle redisplay
else
zle push-input
fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z
^ z ^ z jak zsh powyżej jest możliwe w bash, choć jest trochę niechlujny i nie uruchamiałem tego zbyt długo:
"\C-z": "bg\n"
więc ^ z dla zawieszenia jest włączane po uruchomieniu polecenia, a następnie wyłączane dla monitu bash.
Więc znalazłem rozwiązanie, nie dokładnie to, czego chcę, ale do cholery blisko stąd /superuser//a/161922/35223
W pustym wierszu polecenia działa bg (tak, że Ctrl + Z Ctrl + Z zawiesza program i natychmiast wznawia go w tle).
Ctrl+Z
wywołującej bg
, nie jestem pewien, czy wykryję niepustą linię wejściową).
Czy te polecenia, które chcesz uruchomić na pierwszym planie, a następnie przełączyć na tło? Nie wiem, czy jest na to prostszy sposób. Ale jeśli chcesz na początku uruchamiać polecenia, które będą w tle, możesz po prostu dodać znak ampersand na końcu wiersza. np. ping google.com &
zacznie pingować w tle; nie będziesz mógł z nim wchodzić w interakcje, chyba że napiszesz fg
.