Co muszę wiedzieć, aby prawidłowo korzystać z ekranu GNU? [Zamknięte]

106

Właśnie przedstawiłem przyjaciela ekranowi GNU i trudno im się do tego przyzwyczaić. To sprawia, że ​​myślę o podstawowych rzeczach, które powinien wiedzieć o doskonałym narzędziu Screen , tych samych rzeczach, których warto nauczyć kogoś, początkującego, od podstaw. Jakie są analogie i przydatne wskazówki dotyczące zapamiętywania bindów itp.?

Byłoby świetnie.

Henry B.
źródło
1
Istnieje kilka dobrych odpowiedzi na to również tutaj: stackoverflow.com/questions/70661/what-is-gnu-screen
Chris
Ktoś opublikował podobne pytanie do tego w witrynie Błąd serwera .
Vagnerr
Jeśli ktoś dopiero zaczyna i ma problemy z ekranem, może chcieć sprawdzić alternatywny tmux .
Christopher Bottoms

Odpowiedzi:

93

Używam od Screenponad 10 lat i prawdopodobnie używam mniej niż połowy funkcji. Dlatego zdecydowanie nie jest konieczne od razu poznanie wszystkich jego funkcji (i nie polecałbym próbować). Moje codzienne polecenia to:

^A ^W - window list, where am I
^A ^C - create new window
^A space - next window
^A p - previous window
^A ^A - switch to previous screen (toggle)
^A [0-9] - go to window [0-9]
^A esc - copy mode, which I use for scrollback

Myślę, że to wszystko. Czasami korzystam z funkcji podzielonego ekranu, ale na pewno nie codziennie. Drugą wskazówką jest to, że jeśli wydaje się, że ekran się zablokował, ponieważ przypadkowo trafiłeś na jakąś losową kombinację klawiszy, zrób jedno ^Qi drugie, a następnie ^A ^Qspróbuj odblokować.

Greg Hewgill
źródło
1
^ Do listy należy dodać k, aby zamknąć okno.
Léo Léopold Hertz 준영
7
Nie używam ^ A k ze względu na możliwość przypadkowego zabicia więcej niż zamierzam. Zamiast tego po prostu wychodzę z powłoki w oknie za pomocą ^ D (lub exit). Okno ekranu zamyka się automatycznie po wyjściu z ostatniej powłoki w oknie.
Greg Hewgill
9
"^ A esc - tryb kopiowania, którego używam do przewijania wstecz" Jesteś bogiem wśród ludzi, sir.
Rob Howard
4
^ A [robi dokładnie to samo.
atx
Dzięki za ^ A ^ D sztuczkę ... Utknąłem i nie mogłem wrócić do sesji. Na wypadek, gdyby komuś to pomogło, jakiś czas temu napisałem artykuł, który wyjaśnia podstawy ekranów, takich jak tutaj, ale ma jeszcze kilka sztuczek geekpad.ca/blog/post/ ...
Patrick Forget
36

Nie mogłem przyzwyczaić się do ekranu, dopóki nie znalazłem sposobu na ustawienie `` paska stanu '' u dołu ekranu, który pokazuje, na której `` karcie '' lub `` wirtualnym ekranie '' się znajdujesz i jakie są inne. Oto moja konfiguracja:

[roel@roel ~]$ cat .screenrc
# Here comes the pain...
caption always "%{=b dw}:%{-b dw}:%{=b dk}[ %{-b dw}%{-b dg}$USER%{-b dw}@%{-b dg}%H %{=b dk}] [ %= %?%{-b dg}%-Lw%?%{+b dk}(%{+b dw}%n:%t%{+b dk})%?(%u)%?%{-b dw}%?%{-b dg}%+Lw%? %{=b dk}]%{-b dw}:%{+b dw}:"

backtick 2 5 5 $HOME/scripts/meminfo
hardstatus alwayslastline "%{+b dw}:%{-b dw}:%{+b dk}[%{-b dg} %0C:%s%a %{=b dk}]-[   %{-b dw}Load%{+b dk}:%{-b dg}%l %{+b dk}] [%{-b dg}%2`%{+b dk}] %=[ %{-b dg}%1`%{=b dk} ]%{-b dw}:%{+b dw}:%<"

sorendition "-b dw"
[roel@roel ~]$ cat ~/scripts/meminfo
#!/bin/sh
RAM=`cat /proc/meminfo | grep "MemFree" | awk -F" " '{print $2}'`
SWAP=`cat /proc/meminfo | grep "SwapFree" | awk -F" " '{print $2}'`
echo -n "${RAM}kb/ram ${SWAP}kb/swap"
[roel@roel ~]$
Roel
źródło
3
Sprawdź też byobu (profile ekranów): launchpad.net/byobu
Drew Stephens
To niesamowite, dziękuję. Starałem się dowiedzieć, co się właściwie dzieje, kiedy próbowałem podzielić mój terminal. Nie zdawałem sobie sprawy, że muszę najpierw uruchomić screen, aby którekolwiek z tych poleceń zadziałało, głuptasie, wiem.
Ogaday
30

Ctrl+ A? - pokaż ekran pomocy!

James Muscat
źródło
Całkowicie się z tym zgadzam. Jest to o wiele bardziej przydatne niż inne odpowiedzi, ponieważ możesz odliczyć inne polecenia, ale nie możesz tego zrobić odwrotnie. Dużo łatwiej jest też to zapamiętać.
Léo Léopold Hertz 준영
26

Jeśli twój przyjaciel ma zwyczaj naciskać, ^Aaby dostać się do początku linii w Bash, czeka go kilka niespodzianek, ponieważ ^Ajest to przypisanie klawisza polecenia ekranu. Zwykle kończy się zamrożeniem ekranu, prawdopodobnie z powodu jakiegoś losowego klawisza, który nacisnąłem po ^A:-)

W takich przypadkach próbuję

^A si ^A qblokuj / odblokuj przewijanie terminala

żeby to naprawić. Aby przejść na początek wiersza na ekranie, należy wykonać sekwencję klawiszy ^A a.

agnul
źródło
1
Łatwo jest zmienić znak ucieczki z ^ A na coś innego. Szczegóły umieściłem w mojej odpowiedzi.
Andrew Johnson,
3
+ 1 + 1 + 1 ^ A s ... dziękuję ... zablokowany ekran :)
Yuji 'Tomita' Tomita
1
@agnul +1 dla ciebie dla ^ A a Jestem użytkownikiem ^ A w normalnej sesji bash i nie mogę go używać w sesji screen. Dzięki za wspaniałą poradę! :)
icasimpan
Dziękuję ci 100 razy za powiedzenie mi, jak sprawić, by ctrl A działał na ekranie. Szukałem tego przez całe życie.
user674669
Czy wielkość liter w „A” i „a” ma znaczenie?
Aditya MP
12

Możesz przemapować klawisz Escape z Ctrl+, Aaby był innym wybranym klawiszem, więc jeśli używasz go do czegoś innego, np. Aby przejść na początek linii w bash, wystarczy dodać linię do swojego ~ /. plik screenrc. Aby zrobić to ^ b lub ^ B, użyj:

escape ^bB

Z poziomu wiersza poleceń użyj nazw sesji, aby kontrolować wiele sesji. Używam jednej sesji na zadanie, każda z wieloma zakładkami:

  screen -ls # Wyświetla listę twoich bieżących sesji screen
  screen -S <nazwa> # Tworzy nową sesję screen o nazwie nazwa
  screen -r <nazwa> # Łączy się z nazwanymi sesjami screen

Podczas korzystania z ekranu potrzebujesz tylko kilku poleceń:

  ^ A c Utwórz nową powłokę
  ^ A [0-9] Zmień powłokę
  ^ A k Zabij aktualną powłokę
  ^ A d Odłącz od ekranu
  ^ A? Pokaż pomoc

Doskonałe szybkie odniesienie można znaleźć tutaj . Warto dodać do zakładek.

Andrew Johnson
źródło
Używam zagnieżdżonych sesji ekranowych. Zaczynam od zewnętrznego, screen -e^oowięc mogę użyć do tego Ctrl + O, a potem wewnętrzne, screen -maby rozpocząć nowe sesje.
staticsan
1
Możesz zmienić klawisz Escape w locie. W uruchomionej sesji ekranu wpisz, ^A :a \Bbnastępnie naciśnij klawisz Enter, aby ustawić klawisz Escape na ^ B. Ogólnie, ^A :pozwala ocenić polecenie, które .screenrcrozumiesz.
malana
8

Kilka wskazówek dla tych, którzy trochę zaznajomili się z ekranem, ale zazwyczaj nie pamiętają rzeczy, które przeczytali na stronie podręcznika:

  • Zmiana nazwy okna ekranu jest bardzo łatwa: ctrl+ A shift+ A.
  • Czy przegapiłeś ostatnią wiadomość z ekranu? ctrl+ a ctrl+ mpokaże to ponownie.
  • Jeśli chcesz coś uruchomić (na przykład śledzenie pliku) i chcesz, aby screen powiedział ci, kiedy nastąpiła zmiana, użyj ctrl+ A shift+ mna oknie docelowym. Ostrzeżenie: powiadomi Cię, jeśli coś się zmieni.
  • Chcesz bezpośrednio wybrać okno 15? Wypróbuj w swoim .screenrcpliku:
bind  ! select 11
bind  @ select 12
bind \# select 13
bind  $ select 14
bind  % select 15
bind \^ select 16
bind  & select 17
bind  * select 18
bind  ( select 19
bind  ) select 10

To przypisuje ctrl+ a shift+ 0 through 9dla Windows 10 do 19.

staticsan
źródło
7

Ctrl+ Ato polecenie podstawowe

Ctrl+ A N= przejdź do ekranu *** N *** ext

Ctrl+ A P= przejdź do ekranu *** P *** revious

Ctrl+ A C= *** C *** utwórz nowy ekran

Ctrl+ A D= *** D *** na ekranie

Niko Gunadi
źródło
6

http://www.debian-administration.org/articles/34

Napisałem to kilka lat temu, ale nadal jest to dobre wprowadzenie, które zbiera wiele pozytywnych opinii.


źródło
Link jest (faktycznie) uszkodzony:$VAR1 = \'Can\'t connect to local MySQL server through socket \'/var/run/mysqld/mysqld.sock\' (111 "Connection refused") at ../lib/Singleton/DBI.pm line 95. ';
Peter Mortensen
6

Muszę to dodać: dodaj

bind s

do twojego .screenrc, jeśli - tak jak ja - używałeś podzielonych okien, ponieważ C-a Sdzieli rzeczywiste okno, aleC-a s zamraża je. Więc właśnie wyłączyłem skrót do zamrażania.

Zsolt Botykai
źródło
2
^-Qodblokowuje się, jeśli trafisz^-S
Plato
Masz rację @Plato. Nadal pracuję w środowisku z użytkownikami, którzy nie zapamiętają prawie żadnego skrótu… Musiałem to wyłączyć.
Zsolt Botykai
NP Po prostu znalazłem ten wątek jako pierwszy i wyszukałem `` zamrożenie '' i nie znalazłem tego, czego szukałem
Plato
6

Ctrl+ ato specjalny klucz.

Ctrl+ a d- [d] etach, zostaw programy (irssi?) w tle, idź do domu.

Ctrl+ a c[c] stwórz nowe okno Ctrl+ a 0-9przełączaj się między oknami według numeru

screen -r - wróć do odłączonej sesji

To obejmuje 90% przypadków użycia. Nie próbuj wyświetlać wszystkich funkcji naraz.

tadeusz
źródło
Chociaż, kiedy po raz pierwszy się o tym dowiedziałem, screenbyłem zdezorientowany, co tak naprawdę oznacza odłączenie i ponowne podłączenie ekranu. Cytat : „... możesz mieć długo działające zadania na osobnych konsolach (np. Ssh na zdalnym komputerze, sesje IRC,…) na danej maszynie, odłączyć się od sesji, przenieść z jednej fizycznej lokalizacji do drugiej, połączyć się z maszyna przez ssh i ponownie podłącz się do sesji screen, aby kontynuować pracę. "
JW.
4

Niezbyt istotne, nie tylko związane z ekranem, ale włączenie 256 kolorów w moim terminalu, GNU Screen i Vim znacznie poprawiły moje wrażenia z ekranu (zwłaszcza, że ​​koduję w Vimie około 8 godzin dziennie - jest kilka świetnych, przyjaznych dla oczu schematów kolorów).

jkramer
źródło
Dziękuję Ci! Dręczyło mnie to od jakiegoś czasu.
Dan Goldstein
3

Pierwsza modyfikacja pliku .screenrc to zmiana polecenia escape. Podobnie jak wielu z was, nie podoba mi się domyślna sekwencja Ctrl-A ze względu na jej interferencję z tą podstawową funkcjonalnością w prawie każdym innym kontekście. W moim pliku .screenrc dodaję:

ucieczka `e

To jest backtick-e.

Dzięki temu mogę używać backticka jako klawisza ucieczki (np. Aby stworzyć nowy ekran, wciskam backtick-c, odłączam to backtick-d, backtick-? To pomoc, backtick-backtick to poprzedni ekran itp.). Jedynym sposobem, w jaki to przeszkadza (i musiałem zerwać z nawykiem) jest użycie backticka w wierszu poleceń do przechwycenia danych wyjściowych wykonania lub wklejenie wszystkiego, co zawiera lewy przycisk. W pierwszym przypadku zmodyfikowałem swój nawyk, używając konwencji BASH $ (polecenie). W tym drugim przypadku po prostu otwieram kolejny xterm lub odłączam się od ekranu, a następnie wklejam zawartość zawierającą lewy znacznik. Na koniec, jeśli chcę wstawić dosłowny lewy przycisk, po prostu wciskam backtick-e.

Gary Chambers
źródło
znakomity. Cały czas używam odwrotnych znaków, chociaż wiem, że powinienem używać $ (...), więc teraz chyba będę musiał zmienić swoje sposoby. Backtick jest trochę na uboczu, ale fajnie jest mieć pojedynczy klawisz bez potrzebnych modyfikatorów. Ale dlaczego „e” i jak to pamiętasz?
ikonoklast
Właśnie przetestowałem `` ucieczkę '' i działa ładnie i wydaje się łatwiejsze do zapamiętania. Jeśli naciśniesz lewy przycisk i nie uzyskasz tego, czego się spodziewasz, po prostu naciśnij go ponownie.
ikonoklast
Zrobiłem to, ale czy istnieje sposób na wpisanie znaku wstecznego na ekranie? Czasami jest to konieczne, a nienawidzę konieczności odłączania się, aby to zrobić ...
Guillochon
@Guillouchon: poprzedni komentarz dokładnie to wyjaśnia.
tripleee
3

Trwają interesujące prace nad uzyskaniem dobrej konfiguracji ekranu GNU, które są domyślnie wykonywane w następnej wersji Ubuntu Server, co obejmuje użycie dolnej części ekranu do wyświetlenia wszystkich okien, a także innych przydatnych szczegółów maszyny (takich jak liczba aktualizacji dostępne i czy komputer wymaga ponownego uruchomienia). Prawdopodobnie możesz je pobrać .screenrci dostosować do swoich potrzeb.

Najbardziej przydatne polecenia, które mam w moim, .screenrcto:

shelltitle "$ |bash" # Make screen assign window titles automatically
hardstatus alwayslastline "%w" # Show all window titles at bottom line of term

Dzięki temu zawsze wiem, które okna są otwarte i co się w nich aktualnie dzieje.

David Dean
źródło
3

Używam następujących do ssh:

#!/bin/sh
# scr - Runs a command in a fresh screen
#
# Get the current directory and the name of command

wd=`pwd`
cmd=$1
shift

# We can tell if we are running inside screen by looking
# for the STY environment variable.  If it is not set we
# only need to run the command, but if it is set then
# we need to use screen.

if [ -z "$STY" ]; then
        $cmd $*
else
        # Screen needs to change directory so that
        # relative file names are resolved correctly.
        screen -X chdir $wd

        # Ask screen to run the command
        if [ $cmd == "ssh" ]; then
                screen -X screen -t ""${1##*@}"" $cmd $*
        else
                screen -X screen -t "$cmd $*" $cmd $*
        fi
fi

Następnie ustawiam następujące aliasy bash:

vim() {
        scr vim $*
}

man() {
        scr man $*
}

info() {
        scr info $*
}

watch() {
        scr watch $*
}

ssh() {
        scr ssh $*
}

Otwiera nowy ekran dla powyższych aliasów i iff używając ssh, zmienia tytuł ekranu na nazwę hosta ssh.

Peter Mortensen
źródło
2

Lubię konfigurować sesję ekranową z opisowymi nazwami okien. ^ a A pozwoli ci nadać nazwę bieżącemu oknu, a ^ a "pokaże listę twoich okien. Po zakończeniu odłącz ekran za pomocą ^ ad i podłącz ponownie za pomocą screen -R

innaM
źródło
1

Lubię używać screen -d -RRdo automatycznego tworzenia / dołączania do podanego ekranu. Stworzyłem funkcje basha, aby było to łatwiejsze ...

function mkscreen
{
    local add=n

    if [ "$1" == '-a' ]; then
        add=y
        shift;
    fi

    local name=$1;
    shift;
    local command="$*";

    if [ -z "$name" -o -z "$command" ]; then
        echo 'Usage: mkscreen [ -a ] name command

    -a          Add to .bashrc.' 1>&2;
        return 1;
    fi

    if [ $add == y ]; then
        echo "mkscreen $name $command" >> $HOME/.bashrc;
    fi

    alias $name="/usr/bin/screen -d -RR -S $name $command";

    return 0;
}

function rmscreen
{
    local delete=n

    if [ "$1" == '-d' ]; then
        delete=y
        shift;
    fi

    local name=$1;

    if [ -z "$name" ]; then
        echo 'Usage: rmscreen [ -d ] name

    -d          Delete from .bashrc.' 1>&2;
        return 1;
    fi

    if [ $delete == y ]; then
        sed -i -r "/^mkscreen $name .*/d" $HOME/.bashrc;
    fi

    unalias $name;

    return 0;
}

Tworzą alias do /usr/bin/screen -d -RR -S $name $command. Na przykład lubię używać irssi w sesji screen, więc w moim .bashrc (pod tymi funkcjami) mam:

mkscreen irc /usr/bin/irssi

Wtedy mogę po prostu pisać irc terminal, aby dostać się do irssi. Jeśli ekran 'irc' jeszcze nie istnieje, to jest tworzony i uruchamiany z niego / usr / bin / irssi (co oczywiście łączy się automatycznie). Jeśli już działa, po prostu podłączam się do niego, siłą odłączając każdą inną instancję, która jest już do niego dołączona. To całkiem miłe.

Innym przykładem jest tworzenie tymczasowych aliasów ekranowych dla perldoców, gdy je spotykam:

mkscreen perlipc perldoc perlipc
perlipc # Start reading the perldoc, ^A d to detach.
...
# Later, when I'm done reading it, or at least finished
# with the alias, I remove it.
rmscreen perlipc 

Opcja -a (musi być pierwszym argumentem) dołącza alias ekranu do .bashrc (więc jest trwała), a -d usuwa go (może to być destrukcyjne, więc używaj go na własne ryzyko). xD

Dodać:

Kolejny bash-ism, który uważam za wygodny podczas dużej pracy z ekranem:

alias sls='/usr/bin/screen -ls'

W ten sposób możesz wyświetlić listę ekranów za pomocą znacznie mniejszej liczby naciśnięć klawiszy. Nie wiem, czy slskoliduje z jakimikolwiek istniejącymi narzędziami, ale wtedy tak się nie stało w moim systemie, więc zdecydowałem się na to.

bambams
źródło
0

^ AA przełącza się z powrotem na ekran, z którego właśnie przyszedłeś.

manekin
źródło
2
^ A ^ A przełącza z powrotem, ^ AA pozwala na zmianę nazwy tytułu okna.
Andrey Starodubtsev
0

Ctrl+ Ato świetny znak specjalny dla ludzi z Uniksa, ale jeśli używasz screen do rozmowy z OpenVMS , to brak możliwości ^ A sprawi, że będziesz łysy przedwcześnie.

W VMS , jeśli edytujesz polecenie DCL przed wykonaniem z bufora historii, tryb wstawiania jest wyłączony (musi to być z kilku powodów, o które nie będę tutaj wchodził) ... aby go włączyć, więc nie Aby nie nadpisywać swojego polecenia zamiast usuwać rzeczy, musisz nacisnąć `^ A.

user2146463
źródło
Używam screen -e ^Llz podobnych powodów; Po prostu nie mogę oduczyć się wciskając ctrl-A, aby przejść na początek linii w Emacsie. Na szczęście ctrl-L jest naciśnięciem klawisza, którego rzadko potrzebuję, a także IMHO ładnie łączy się z jego ogólnym znaczeniem (przerysowanie / czyszczenie ekranu).
tripleee
@tripleee: My .screenrchas escape ^@^@, który używa znaku null zamiast control-A. W większości systemów znak null można wprowadzić jako spację kontrolną, co jest bardzo łatwe do wpisania. (Mam zagnieżdżoną sesję ekranu uruchomioną w oknie w mojej głównej sesji; dla tej mam escape ^]^].)
Keith Thompson