Jak poznać bieżącą nazwę sesji tmux, uruchamiając komendę tmux

34

Piszę scenariusz. Naprawdę chcę to wiedzieć. Mam nadzieję, że plik wykonywalny tmux może mi to powiedzieć.

znajduję

tmux rename <newname>

może zmienić nazwę bieżącej sesji. Ale nie mogę znaleźć polecenia pobrania własnej nazwy.

Jimm Chen
źródło

Odpowiedzi:

49

W tmux 1.2 (i nowszych) możesz użyć -popcji wypisaniadisplay-message komunikatu na standardowe wyjście (zamiast wyświetlania go na dołączonym kliencie):

tmux display-message -p '#S'

#Sjest sformatowany jako nazwa sesji (zobacz opis status-leftopcji na stronie man).

Chris Johnsen
źródło
+1, znacznie lepiej niż moja odpowiedź.
chepner
Naprawdę doceniam, że wskazałeś, że wymaga tmux 1.2, który jest dokładnie wersją dostępną do automatycznej aktualizacji online openSUSE 11.3.
Jimm Chen
W przypadku tmux 1.8 zwraca to nazwę dołączonej sesji, nawet gdy nie pracuję w tej sesji.
Mihai Danila,
Poniższa odpowiedź Tima People działa z tmux 1.8 i nowszymi, a także dotyczy podniesionych przez niego punktów. To lepsza odpowiedź.
Alexandros
8

Dziwi mnie, że po prawie 5 latach nikt nie zauważył, że żadna z tych odpowiedzi nie jest odpowiednia. Chociaż oba działają dobrze, o ile bieżący TTY jest dołączony do jedynej sesji tmux na hoście, obie te odpowiedzi nie działają, jeśli:

  1. bieżąca sesja terminalowa nie jest częścią sesji tmux, lub
  2. istnieje wiele dołączonych sesji Tmux

W pierwszym przypadku obie odpowiedzi podają tutaj nazwę dołączonej sesji (niezależnie od tego, czy bieżący tty jest zarządzany przez tę sesję). W tym drugim przypadku wynik jest prawdopodobnie nieokreślony lub spowoduje powstanie wielu odpowiedzi.

Prawidłowe pytanie powinno brzmieć: „Jak nazywa się sesja tmux, do której dołączona jest moja bieżąca sesja terminalowa?”

Aby odpowiedzieć na to pytanie, wykonaj:

for s in $(tmux list-sessions -F '#{session_name}'); do
    tmux list-panes -F '#{pane_tty} #{session_name}' -t "$s"
done | grep "$(tty)" | awk '{print $2}'

Działa to niezależnie od liczby sesji tmux (dołączonych lub innych) i niezależnie od tego, czy bieżąca sesja terminalowa jest częścią sesji tmux, czy nie.

Tim Peoples
źródło
1
Świetna odpowiedź. Zamiast przeglądać nazwy poszczególnych sesji w celu wyświetlenia ich paneli, możesz także użyć tmux list-panes -a -F '#{pane_tty} #{session_name}'do wyświetlenia listy paneli każdej sesji. Nie jestem pewien, jak nowy -ajest, więc YMMV.
Brian Cline
Powróciłem do tego pytania po użyciu zaakceptowanej odpowiedzi i nie powiodło się zgodnie z opisanymi tutaj problemami. Proszę to zagłosować. Jeśli to możliwe, zaakceptowaną odpowiedź należy zmienić.
Alexandros
1
Metoda 1 działa dobrze, jeśli jest połączona ze sprawdzaniem TMUXzmiennej środowiskowej przed uruchomieniem tmux display-message -p '#S'dla typowej konfiguracji pulpitu.
ZeroPhase
8

Rozszerzony / poprawione odpowiedź Tim-Peoples męska zgodnie komentarzu don_crissti koszulka na Dlaczego to grep -vnie działa jak powinno? .

Komenda „$ (tty)” w odpowiedzi ludzi czasu

| grep „$ (tty)” |

nie działałby w tym kontekście zgodnie z oczekiwaniami. Zwraca wartość ciągu „nie tty”.

Zastąpienie go zmienną rozwiązuje ten problem.

tty = $ (tty)

...

| grep "$ tty" |

Ponadto, gdy nie istnieją sesje tmux, oryginalny kod wygeneruje

Komunikat o błędzie „Brak serwera działającego na / tmp / tmux-1000 / default” .

Dodaj, 2>/dev/nulla kod będzie działał bez drukowania komunikatu o błędzie.

Zmodyfikowany kod brzmi:

tty=$(tty)
for s in $(tmux list-sessions -F '#{session_name}' 2>/dev/null); do
    tmux list-panes -F '#{pane_tty} #{session_name}' -t "$s"
done | grep "$tty" | awk '{print $2}'
jasna strona
źródło
1
Jaka jest poprawa? Jeśli jest to konieczne, powinieneś rozważyć przesłanie go jako edycji, a nie odpowiedzi. Aby była to dobra odpowiedź, prawdopodobnie powinieneś rozważyć dodanie bardziej opisowego tekstu.
Seth
1
@seth, chciałem skomentować, ale dziwnie nie miałem wystarczającego uznania, aby to zrobić.
jasna strona
Aby skomentować, potrzebujesz 50 punktów reputacji . Zwykle nie jest dobrym pomysłem komentowanie złożonym kodem, ponieważ brakuje podziałów linii i tak dalej. Twoja edycja sprawiła, że ​​była to całkiem dobra odpowiedź IMHO.
Seth
Och, rozumiem teraz. Kwestia „tty” to bzdura. Nie używam tej zabawki: D
Tim Peoples,
1
@TimPeoples Chociaż może to być problem Bash. Bash jest nadal standardem do obsługi skryptów powłoki w celu zapewnienia zgodności na nowoczesnych terminalach. Jasne, standard posix jest idealny; ale bash ma pewne funkcje, z których korzystają wszystkie bardziej zaawansowane terminale. Naciskając Bash, większość innych głównych terminali powinna po prostu działać. Po prostu uruchamiam sprawdzanie powłoki i wychwytuję wiele złych błędów i problemów z formatowaniem. (głównie przy użyciu starej składni zamiast obecnej, bardziej opisowej)
ZeroPhase
4
  • Odpowiedź Chrisa Johnsena zwraca nazwę sesji nawet w przypadku zapytania spoza niej.
  • odpowiedź jasnej strony i Tima Peoplesa zakłada tty.

Zamiast tego uważam, że działa to dla mnie dokładnie:

if [[ -n "$TMUX_PANE" ]]; then
    session_name=$(tmux list-panes -t "$TMUX_PANE" -F '#S' | head -n1)
fi
dset0x
źródło
3

Nie jest to idealne, ale możesz wyodrębnić nazwę dołączonej sesji za pomocą awk:

tmux list-sessions -F '#{session_name} #{session_attached,yes,}' | awk '$2=="yes" {print $1}'

Format niestandardowy jest nieco łatwiejszy do przeanalizowania niż domyślny.

chepner
źródło