Как разделить новое окно и запустить команду в этом новом окне, используя tmux?

28

я пытался

tmux -c "shell command" split-window

но это не похоже на работу.

Используя tmux split-window, можно разделить новое окно.

ОБНОВЛЕНИЕ :

Используя tmux split-window 'exec ping g.cn'можно запустить команду ping, но при остановке новое окно будет закрыто.

atupal
источник
4
man tmux | less -p remain-on-exit...
Джейсонвриан

Ответы:

38

Использование:

tmux split-window "shell command"

Команда split-windowимеет следующий синтаксис:

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

(из man tmuxраздела «Окна и панели»). Обратите внимание, что порядок важен - команда должна идти после любой из предыдущих опций, которые появляются, и это должен быть один аргумент, поэтому вам нужно заключить его в кавычки, если у него есть пробелы.


Для таких команд, ping -cкоторые быстро завершаются, вы можете remain-on-exitсначала установить опцию:

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

Панель будет открыта после pingзавершения, но будет помечена как «мертвая», пока вы не закроете ее вручную.

Если вы не хотите менять общие параметры, есть другой подход. Команда запускается с sh -c, и вы можете использовать это, чтобы окно оставалось живым в конце:

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

Здесь вы используете команду shell readдля ожидания ввода новой строки после ввода основной команды. В этом случае вывод команды будет оставаться до тех пор, пока вы не нажмете Enterна панели, а затем автоматически закроется.

Майкл Гомер
источник
Спасибо, Михал Гомер :-). Я тоже нашел это сейчас. Но как сохранить новое окно закрытым?
atupal
@atupal: см редактировать - либо установить, remain-on-exitлибо использовать cmd ; read.
Майкл Гомер
2

bash --rcfile

Этот метод открывает новую оболочку, запускает команды и оставляет вас там после выполнения команд:

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

Или, если команда не имеет специальных терминальных символов, таких как ;просто:

tmux-split-cmd ping google.com

Это использует:

Еще один интересный вариант:

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

который убивает предыдущий сплит, если он уже существует, и помогает сохранить только один дополнительный сплит за все время.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
источник