tmux new-window – дождитесь окончания сеанса?

Я делаю следующее (это всего лишь пример, более сложные комбаты):

xterm -fa "Inconsolata" -e tmux new-session -s alpha & disown %% tmux new-window -t alpha bash tmux new-window -t alpha zsh 

… который отлично работает, когда я набираю его в терминале, предоставляя мне xterm с сеансом tmux с тремя окнами. НО, если я помещу вещь в сценарий, она перестанет работать;

  no server running on /tmp/tmux-1153/default no server running on /tmp/tmux-1153/default 

ошибка и только одно окно в новой сессии сеанса tmux .

После нескольких экспериментов я обнаружил, что он будет работать снова, если я добавлю

 sleep 5 

(или аналогичный) между командой disown и tmux new-window . Очевидно, что xterm не завершил настройку до запуска этой команды, и поэтому перед запуском сеанса будет запущено tmux new-window если я не задержу там задержку.

Он работает, но он не изящный. Есть ли способ сказать tmux подождать, пока сессия alpha будет поднята?

  • Как я могу создать файл на основе команды оболочки в .tmux.conf?
  • Как разделить окно tmux на третьи?
  • tmux: установить сеанс по умолчанию для подключения
  • tmux с большим количеством терминалов, чем панели
  • Как я могу поменять мою оболочку входа?
  • Tmux отображает «<xzy not ready>» в строке состояния
  • tmux, Vim и Solarized
  • tmux "last-session" привязка
  • One Solution collect form web for “tmux new-window – дождитесь окончания сеанса?”

    Вы можете сделать это двумя способами:

    1. Используйте метод sleep . Я не вижу ничего плохого в том, чтобы использовать sleep кроме как иногда, если вы выберете слишком короткое время. Чтобы обмануть его, используйте

       while ! tmux has-session; do sleep 1; done 

      или

       while ! tmux has-session -t alpha; do sleep 1; done 
    2. Используйте что-то вроде xtoolwait который запустит X-клиент (ваш эмулятор терминала) в фоновом режиме и вернется, когда он отобразил его окно.

    Если вы перейдете ко второму варианту (что может быть лучше), не забудьте удалить & в конце команды, запускающей ваш терминал, а также отказаться disown работы.

    Команда становится:

     xtoolwait xterm -fa "Inconsolata" -e tmux new-session -s alpha tmux new-window -t alpha bash 

    Если xtoolwait еще не установлен в вашем Unix, он, скорее всего, будет доступен как пакет (он существует уже целую вечность ). Используйте его менеджер пакетов для его установки.

    EDIT : из комментариев кажется, что tmux занимает слишком много времени, чтобы появиться после того, как терминал отобразил его окно, даже если используется xtoolwait . Поэтому в этой ситуации я бы продолжил цикл с вызовом sleep 1 до тех пор, пока не tmux сеансе tmux .

    Linux и Unix - лучшая ОС в мире.