Запретить закрытие панели / окна после завершения команды - tmux


33

В моем tmux.confфайле он настроен для открытия окон, именования их, настройки панелей и т. Д. И т. Д.

Однако у меня есть одна проблема: если одна из панелей запускает команду, скажем ls, панель закрывается сама после ее завершения (мгновенно). Есть ли способ предотвратить такое поведение? Или он выпал до нормальной оболочки после завершения команды?

Я предполагаю, что мне нужно запустить команду shell -> execute при запуске панели, но я буду проклят, если смогу выяснить, как это сделать. Я немного погуглил по этой проблеме, но потерпел неудачу.

Ответы:


22

У вас есть несколько вариантов.

  1. Вместо запуска lsв вашем окне, запустите оболочку, а затем отправьте нажатия клавиш оболочки для выполнения:

    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. Вы можете создать последовательность команд таким образом, чтобы после запуска других команд вы оставили себя в оболочке bash:

    tmux start-server  
    tmux new-session -d
    tmux new-window 'ls;bash -i'
    
  3. Смотрите в ответе jasonwryan подробности о remain-on-exitвозможности сохранения панелей живыми после завершения их процесса, чтобы вы могли просмотреть выходные данные.

  4. Если выходные данные какой-либо команды стоили увидеть один раз, возможно, стоит обновить. Если вы контролируете вывод чего-либо, вы можете watchпериодически получать новый вывод. Это должно хорошо сочетаться с панелями в tmux:

    tmux start-server  
    tmux new-session -d
    tmux new-window 'watch -n 60 ls'
    

Спасибо чувак! Потрясающий ответ, номер 2 и номер 4 - именно то, над чем я работал, но номер 1 также кажется отличной альтернативой. Спасибо за помощь, это очень ценится (вы оба).
Тушить

1
Преимущество # 1 состоит в том, что команда остается в истории оболочки и может быть легко выполнена повторно. Если команда была большой и некрасивой, то это очень полезно.
goertzenator

1
Он работает для меня без start-serverкоманды, я думаю, что он запускается автоматически, если это необходимо. Есть ли преимущество в том, чтобы называть это явно?
Луатор

1
@luator Я думаю, что автоматический запуск сервера, если он не найден, возможно, был добавлен с tmuxтех пор, как я написал этот ответ. Я не знаю никакого преимущества, если ваша версия порождает процесс сервера, если это необходимо.
Калеб

13

Вы можете использовать remain-on-exitопцию:

оставаться на выходе [вкл | off]
Окно с этим установленным флагом не уничтожается при выходе из программы, запущенной в нем. Окно может быть возобновлено с помощью команды respawn-window.

Чтобы упростить процесс восстановления, вы можете привязать его к ключу:

bind-key R respawn-window

Это гарантирует, что у вас не останется мертвых окон при выходе из программы.


Я был там! У меня закончилось время и я решил отредактировать свой ответ. Да, это третий вариант, основным недостатком которого является то, что он оставляет окно только для чтения, которое невозможно повторно использовать без повторного создания.
Калеб

Хорошая точка зрения. Я обновил (полу) обходной путь.
Джейсонвриан

Это работает с панелями?
azmeuk

1
установить это из командной строки можно с помощьюtmux set-option remain-on-exit on
rmanna

1
@azmeukset-option -g remain-on-exit on bind-key r respawn-pane
HappyFace

1

Вот расширенный пример с использованием send-keysметода, рекомендованного @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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.