Jak podzielić nowe okno i uruchomić polecenie w tym nowym oknie za pomocą tmux?

28

próbowałem

tmux -c "shell command" split-window

ale wydaje się, że to nie działa.

Za pomocą tmux split-windowmożna podzielić nowe okno.

AKTUALIZACJA :

Za pomocą tmux split-window 'exec ping g.cn'można uruchomić polecenie ping, ale po zatrzymaniu nowe okno zostanie zamknięte.

atupal
źródło
4
man tmux | less -p remain-on-exit...
jasonwryan

Odpowiedzi:

38

Posługiwać się:

tmux split-window "shell command"

split-windowKomenda ma następującą składnię:

 split-window [-dhvP] [-c start-directory] [-l size | -p percentage] [-t
         target-pane] [shell-command] [-F format]

(z man tmuxsekcji „Windows i panele”). Zauważ, że kolejność jest ważna - polecenie musi nastąpić po którejkolwiek z poprzednich opcji, które się pojawią, i musi to być pojedynczy argument, więc musisz go zacytować, jeśli ma spacje.


W przypadku takich poleceń, ping -cktóre kończą się szybko, możesz najpierw ustawić remain-on-exitopcję:

tmux set-option remain-on-exit on
tmux split-window 'ping -c 3 127.0.0.1'

Okienko pozostanie otwarte po pingzakończeniu, ale będzie oznaczone jako „martwe”, dopóki nie zamkniesz go ręcznie.

Jeśli nie chcesz zmieniać ogólnych opcji, istnieje inne podejście. Polecenie jest uruchamiane za pomocą sh -c, i możesz wykorzystać to, aby okno pozostało przy życiu na końcu:

tmux split-window 'ping -c 3 127.0.0.1 ; read'

Tutaj używasz readpolecenia powłoki, aby poczekać na nowy wiersz wprowadzony przez użytkownika po zakończeniu polecenia głównego. W takim przypadku dane wyjściowe polecenia pozostaną do momentu naciśnięcia Enterw panelu, a następnie zostaną automatycznie zamknięte.

Michael Homer
źródło
Dzięki Michawl Homer :-). Właśnie to znalazłem /. Ale jak uchronić nowe okno przed zamknięciem?
atupal
@atupal: Zobacz edycję - ustaw remain-on-exitlub użyj cmd ; read.
Michael Homer
2

bash --rcfile

Ta technika otwiera nową powłokę, uruchamia polecenia i pozostawia cię tam po zakończeniu poleceń:

tmux-split-cmd() ( tmux split-window -dh -t $TMUX_PANE "bash --rcfile <(echo '. ~/.bashrc;$*')" )
tmux-split-cmd 'cd; pwd; ping google.com'

Lub jeśli polecenie nie ma specjalnych znaków terminalu, takich jak ;:

tmux-split-cmd ping google.com

Wykorzystuje to:

Innym interesującym wariantem jest:

tmux-split-cmd-uniq() (
  if [ "$(tmux list-panes | wc -l | cut -d' ' -f1)" -ne 1 ]; then
    tmux kill-pane -t 1
  fi
  tms "$@"
)

który zabija poprzedni podział, jeśli już istnieje, i pomaga zachować tylko jeden dodatkowy podział przez cały czas.

Ciro Santilli
źródło