Как запустить tmux с несколькими окнами в разных каталогах?
Я хочу использовать скрипт для открытия сеанса tmux с 6 окнами, каждый в другом каталоге. Я начал с сценарий, который я нашел и попробовал это сначала:
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
Я понятия не имею, почему это происходит, но я все еще думаю, что я делаю это неправильно. Есть ли лучший способ настроить сеанс tmux в нескольких каталогах?
5 ответов
ошибки оболочки, вероятно, из-за какой-то проблемы в ваших файлах запуска (или что-то, что они запускают).
как прокомментировал Шеллер, временно включая команду set -vx
в начале последовательности запуска-хороший способ узнать, где происходят ошибки.
Если вы найдете -vx
вывод слишком подробный, вы можете попробовать " printf debugging "(вручную добавляя операторы отладки в файлы запуска, пока вы не сможете сузить, какие именно строки вызывают ошибки):
- поставить
echo start of .bashrc
иecho end of .bashrc
в начале/конце.bashrc
чтобы увидеть, если ошибка возникает во время.bashrc
. Если нет, инструмент других файлов запуска:.bash_profile
/.bash_login
/.profile
. Если ошибки происходят до этого файла, то проблема может быть в/etc/profile
. - как только вы знаете, какой файл обрабатывается при возникновении ошибок, добавьте больше отладочных выходов вокруг каждого "основного блока" или строки, чтобы сузить ответственный створ.
- ошибки могут быть не в самом файле запуска, а в сценарии, который он запускает.
примечание: эти дополнения отладки должны быть временными, так как они вызовут проблемы, если вы когда-либо используете программу, которая делает автоматические логины (например,rsync, основанный на SSH доступ Git и т. д.) поскольку эти программы ожидают "чистого" соединения без такого шума отладки.
нет необходимости в использовании в shell-command аргумент, данный любому tmux new-session
или tmux new-window
.
новое окно будет "наследовать"† текущий рабочий каталог при использовании new-session
и new-window
из командной строки (т. е. когда сделано через tmux
двоичный файл, а не через привязку или tmux-:
запрос). Согласно файлу изменений, похоже, что это было так, так как tmux 0.6 (в по крайней мере для new-window
).
† это tmux - опосредованное наследование, а не наследование "родитель–потомок", которое является обычным механизмом передачи по cwd.
этот скрипт работает для меня с 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
).
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: 1.9.2@rails_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 me@myhost
затем вы можете начать новый сеанс с:
mux project_name
Я использую его некоторое время и по большей части имел хороший опыт.
можно использовать Teamocil вместо. Teamocil-это простой инструмент, используемый для автоматического создания сеансов, окон и панелей в tmux с файлами YAML.
для тех, кто не устанавливает ruby tmuxp доступен в Python и поддерживает файлы конфигурации Teamocil и Tmuxinator (как в yaml, так и в json).
- источник https://github.com/tony/tmuxp
- Docs http://tmuxp.readthedocs.io/en/latest/
- Pypi https://pypi.python.org/pypi/tmuxp/1.0.0
не говоря уже о том, что есть очень сладкая библиотека за всем этим https://github.com/tony/libtmux
pip install --user tmuxp
добавить ~/.local/ bin / to your $PATH for python user install programs
-
# ~/.tmuxp/workbench.yaml
session_name: workbench
windows:
- name: workbench
layout: main-vertical
panes:
- vim
- pane
- pane
-
tumxp load workbench
Я не мог за всю жизнь заставить-c работать, поэтому я работал над этим, создавая скрипт, который запускается через send - это позволяет мне делать все, что я хочу в каждом сеансе tmux. В случае, если это помогает кому-то еще, вот он:
#!/bin/bash
TMUX_SESSION=mystuff
TOP=~/mydir
tmux new-session -s "$TMUX_SESSION" -n $(pwd) -d
launch_my_window()
{
WINDOW=
NAME=
SUBDIR=
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"