Zapobiegaj zamykaniu panelu / okna po zakończeniu komendy - tmux

33

W moim tmux.confpliku mam go skonfigurowanego do otwierania okien, nazywania ich, konfigurowania okien itp. Itd.

Jednak jednym z moich problemów jest to, że jeśli jedna z paneli uruchamia polecenie, powiedzmy ls, wtedy panel zamyka się po zakończeniu polecenia (natychmiast). Czy jest jakiś sposób, aby temu zapobiec? A może spadnie do normalnej powłoki po zakończeniu polecenia?

Zakładam, że muszę uruchomić powłokę -> wykonać polecenie po uruchomieniu panelu, ale niech mnie szlag, jeśli uda mi się dowiedzieć, jak to zrobić. Trochę googłem za tym problemem, ale znalazłem się krótko.

Gulasz
źródło

Odpowiedzi:

22

Masz kilka opcji.

  1. Zamiast uruchamiać się lsw oknie, uruchom powłokę, a następnie wyślij naciśnięcia klawiszy powłoki, aby wykonać:

    tmux start-server  
    tmux new-session -d -s session  
    tmux new-window -t session:1  
    tmux send-keys -t session:1 ls C-m
    
  2. Możesz wykonać sekwencję poleceń w taki sposób, aby pozostawić się z powłoką bash po uruchomieniu innych poleceń:

    tmux start-server  
    tmux new-session -d
    tmux new-window 'ls;bash -i'
    
  3. Zobacz odpowiedź jasonwryana, aby uzyskać szczegółowe informacje na temat remain-on-exitopcji utrzymania paneli przy życiu po zakończeniu procesu, abyś mógł przejrzeć dane wyjściowe.

  4. Jeśli wyjście jakiegoś polecenia było warte obejrzenia raz, może być warte odświeżenia. Jeśli monitorujesz wyjście czegoś, możesz watchokresowo uzyskać nowe wyjście. To powinno ładnie grać z panelami w tmux:

    tmux start-server  
    tmux new-session -d
    tmux new-window 'watch -n 60 ls'
    
Caleb
źródło
Dzięki stary! Świetna odpowiedź, numer 2 i numer 4 są dokładnie tym, nad czym pracowałem, ale numer 1 wydaje się również świetną alternatywą. Dzięki za wszelką pomoc, jest bardzo doceniana (oboje).
Gulasz
1
Zaletą # 1 jest to, że polecenie pozostaje w historii powłoki i można je łatwo wykonać ponownie. Jeśli polecenie było duże i brzydkie, jest to bardzo pomocne.
goertzenator 17.09.2013
1
Działa dla mnie bez start-serverpolecenia, myślę, że uruchamia się automatycznie w razie potrzeby. Czy jest jednak korzyść z jednoznacznego nazywania tego?
luator
1
@luator Myślę, że automatyczne uruchomienie serwera, jeśli nie zostanie znalezione, mogło zostać dodane, tmuxponieważ napisałem tę odpowiedź. Nie znam żadnej korzyści, jeśli twoja wersja spawnuje proces serwera, jeśli to konieczne.
Caleb
13

Możesz skorzystać z remain-on-exitopcji:

pozostać przy wyjściu [on | off]
Okno z ustawioną flagą nie jest niszczone po wyjściu z niego uruchomionego programu. Okno można ponownie aktywować za pomocą polecenia respawn-window.

Aby uprościć proces odradzania, możesz powiązać go z kluczem:

bind-key R respawn-window

Zapewni to, że po wyjściu programów nie pozostaną martwe okna.

jasonwryan
źródło
Dotarłem tam! Skończyło mi się czas i zdecydowałem, że będę musiał edytować swoją odpowiedź. Tak, jest to trzecia opcja, główną wadą jest to, że pozostawia okno tylko do odczytu, którego nie można ponownie użyć bez ponownego tworzenia.
Caleb
Słuszna uwaga. Zaktualizowałem (częściowo) obejście.
jasonwryan
Czy to działa z panelami?
azmeuk
1
ustawienie tego z wiersza poleceń można wykonać za pomocątmux set-option remain-on-exit on
rmanna
1
@azmeukset-option -g remain-on-exit on bind-key r respawn-pane
HappyFace
1

Oto rozszerzony przykład z wykorzystaniem send-keysmetody zalecanej przez @Caleb

#!/bin/sh
tmux start-server
tmux new-session -d -n 'mywindowname'
tmux send-keys -t mywindowname 'cd notes' Enter 'vim whiteboard/tasks.md' Enter
tmux new-window -d -n 'secondwindowname' # this -d prevents focus from changing to the new window
tmux -2 attach-session -d
jtpereyda
źródło