Подтвердить что ты не робот

Как запустить tmux с несколькими окнами в разных каталогах?

Я хочу использовать script, чтобы открыть сеанс tmux с 6 окнами, каждый из которых находится в другом каталоге. Я начал с a script, я нашел и пробовал это первым:

tmux new-session -s xyz   -n etc -d 'cd /etc'
tmux new-window  -t xyz:1 -n var    'cd /var/log'

Но вскоре я узнал, что это не сработает, как я ожидал - окно будет закрыто после завершения команды оболочки.

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

tmux new-session -s xyz   -n etc -d 'cd /etc; bash -i'
tmux new-window  -t xyz:1 -n var    'cd /var/log; bash -i'
tmux new-window  -t xyz:2 -n var2   'cd /var/log; bash -i'
tmux new-window  -t xyz:3 -n var3   'cd /var/log; bash -i'
tmux new-window  -t xyz:4 -n var4   'cd /var/log; bash -i'
tmux new-window  -t xyz:5 -n var5   'cd /var/log; bash -i'
tmux new-window  -t xyz:6 -n var6   'cd /var/log; bash -i'

tmux select-window -t xyz:1
tmux -2 attach-session -t xyz

Это почти работает. Но если я начинаю больше, чем около 4 окон, я часто вижу следующие ошибки bash в одном из окон после запуска:

bash: [: =: unary operator expected
bash: [: too many arguments
bash: [: =: unary operator expected
bash: [: =: unary operator expected
bash: [: =: unary operator expected
bash: [: =: unary operator expected
bash: [: too many arguments
bash: [: =: unary operator expected
bash: [: =: unary operator expected
bash: [: =: unary operator expected
bash: [: =: unary operator expected
bash: [: =: unary operator expected

Я понятия не имею, почему это происходит, но я все еще думаю, что Im не делает этого правильно. Есть ли лучший способ настроить сеанс tmux по нескольким каталогам?

4b9b3361

Ответ 1

Ошибки оболочки, вероятно, связаны с некоторыми проблемами в ваших файлах запуска (или с их помощью).

Как прокомментировал комментатор, временное включение команды set -vx в начале вашей последовательности запуска - это хороший способ узнать, где происходят ошибки.
Если вы находите вывод -vx слишком многословным, вы можете попробовать "отладка printf" (вручную добавляя операторы отладки в файлы запуска, пока не сможете сузить точно, какие строки вызывают ошибки):

  • Поместите echo start of .bashrc и echo end of .bashrc в начало/конец вашего .bashrc, чтобы увидеть, произошла ли ошибка во время вашего .bashrc. Если нет, используйте другие файлы запуска: .bash_profile/.bash_login/.profile. Если ошибки происходят до этого файла, проблема может быть в /etc/profile.
  • Как только вы узнаете, какой файл обрабатывается при возникновении ошибок, добавьте дополнительные отладочные выходы вокруг каждого "основного блока" или строки, чтобы сузить ответственный раздел/строку.
  • Ошибки могут быть не в самом загрузочном файле, а в script, который он запускает.

Примечание. Эти отладочные дополнения должны быть временными, так как они вызовут проблемы, если вы когда-либо используете программу, которая делает автоматические логины (например, rsync, SSH-based Git доступ и т.д.), поскольку эти программы ожидают "чистого", соединение без присутствия такого отладочного шума.


Не нужно использовать команду cd, такую ​​как в аргументе командной оболочки, указанную либо для tmux new-session, либо tmux new-window.

Новое окно "наследует" текущий рабочий каталог при использовании new-session и new-window из командной строки (т.е. когда делается через двоичный код tmux, а не через или в приглашении tmux- :). Согласно файлу CHANGES, похоже, что это было так, поскольку tmux 0.6 (по крайней мере, для new-window).

Это tmux-опосредованное наследование, а не наследование родительского ребенка, которое является обычным механизмом для прохождения по cwd.

Этот script работает для меня с tmux 1.5:

#!/bin/bash
# var for session name (to avoid repeated occurences)
sn=xyz

# Start the session and window 0 in /etc
#   This will also be the default cwd for new windows created
#   via a binding unless overridden with default-path.
cd /etc
tmux new-session -s "$sn" -n etc -d

# Create a bunch of windows in /var/log
cd /var/log
for i in {1..6}; do
    tmux new-window -t "$sn:$i" -n "var$i"
done

# Set the default cwd for new windows (optional, otherwise defaults to session cwd)
#tmux set-option default-path /

# Select window #1 and attach to the session
tmux select-window -t "$sn:1"
tmux -2 attach-session -t "$sn"

Это может также (в качестве побочного эффекта) облегчить ваши ошибки запуска оболочки, так как путь tmux запускает оболочку, отличается от простой bash -i (она более похожа на bash -l, которая использует ваш .bash_profile/.bash_login/.profile вместо (просто) вашего .bashrc).

Ответ 2

Tmuxinator также очень хорош для этого. В основном вы создаете файлы настроек следующим образом:

# ~/.tmuxinator/project_name.yml
# you can make as many tabs as you wish...

project_name: Tmuxinator
project_root: ~/code/rails_project
socket_name: foo # Not needed. Remove to use default socket
rvm: [email protected]_project
pre: sudo /etc/rc.d/mysqld start
tabs:
  - editor:
      layout: main-vertical
      panes:
        - vim
        - #empty, will just run plain bash
        - top
  - shell: git pull
  - database: rails db
  - server: rails s
  - logs: tail -f logs/development.log
  - console: rails c
  - capistrano:
  - server: ssh [email protected]

Затем вы можете начать новый сеанс с помощью:

mux project_name

Я использовал его некоторое время и имел большой опыт по большей части.

Ответ 3

Вместо этого вы можете использовать Teamocil. Teamocil - простой инструмент, используемый для автоматического создания сеансов, окон и панелей в tmux с файлами YAML.

Ответ 4

Для тысяч, которые не устанавливают ruby ​​ tmuxp доступен в Python и поддерживает как Teamocil, так и Tmuxinator (как в yaml, так и в json).

Не говоря уже о том, что за ним стоит очень слабая библиотека https://github.com/tony/libtmux


 pip install --user tmuxp

добавить ~/.local/bin/в ваш $PATH для программ установки пользователя python

-

# ~/.tmuxp/workbench.yaml
session_name: workbench
windows:
  - name: workbench
    layout: main-vertical
    panes:
      - vim
      - pane
      - pane

-

 tumxp load workbench

Ответ 5

Я не мог на всю жизнь получить работу -c, поэтому я работал над этим, создав script, который запускается через send - это позволяет мне делать все, что я хочу, в каждом сеансе tmux. Если это помогает кому-то другому, вот оно:

#!/bin/bash
TMUX_SESSION=mystuff
TOP=~/mydir

tmux new-session -s "$TMUX_SESSION" -n $(pwd) -d

launch_my_window()
{
    WINDOW=$1
    NAME=$2
    SUBDIR=$3

    SCRIPT=$TMPDIR/tmux.sh.$WINDOW.$NAME
    tmux new-window -t "$TMUX_SESSION:$WINDOW" -n "$NAME"
    cat >$SCRIPT <<%%
cd $TOP/$SUBDIR
# do more stuff here
%%
    chmod +x $SCRIPT
    tmux send -t "$TMUX_SESSION:$WINDOW" $SCRIPT ENTER
    sleep 1
}

launch_my_window 1 "stuff"         subdir1
launch_my_window 2 "morestuff"     subdir2
launch_my_window 3 "yetmorestuff"  subdir3
#...

# Select window #1 and attach to the WINDOW
tmux select-window -t "$TMUX_SESSION:1"
tmux -2 attach-session -t "$TMUX_SESSION"