Запретить закрытие панели / окна после завершения команды - 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.