我想使用脚本打开一个带有6个窗口的tmux会话,每个窗口位于不同的目录中。我从a script I found开始,先尝试了这个:
tmux new-session -s xyz -n etc -d 'cd /etc'
tmux new-window -t xyz:1 -n var 'cd /var/log'
但我很快发现这不会像我预期的那样工作 - 在shell命令完成后窗口将被关闭。
所以我的下一个想法是开始这样的新shell:
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会话?
答案 0 :(得分:30)
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
我已经使用了一段时间,并且在大多数情况下都有很好的经验。
答案 1 :(得分:18)
shell错误可能是由于启动文件中的某些问题(或者它们运行的东西)。
正如shellter评论的那样,在启动序列的早期暂时包含命令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访问等),它们将导致问题,因为这些程序期待“干净”的连接,而不存在这样的调试噪音。
不应该在cd
或tmux new-session
的 shell-command 参数中使用tmux new-window
命令。
当从命令行使用new-session
和new-window
时(即通过tmux
完成时,新窗口将“继承”†当前工作目录二进制,而不是通过绑定或在 tmux - :
提示符。根据CHANGES文件,从 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 启动shell的方式与普通bash -i
不同(这更像是{{ 1}},它使用您的bash -l
/ .bash_profile
/ .bash_login
代替(仅).profile
}。
答案 2 :(得分:9)
您可以改用Teamocil。 Teamocil是一个简单的工具,用于使用YAML文件在tmux中自动创建会话,窗口和窗格。
答案 3 :(得分:6)
对于没有安装ruby的人来说, tmuxp在Python中可用,并且支持Teamocil和Tmuxinator样式配置文件(在yaml和json中)。
更不用说所有https://github.com/tony/libtmux
背后都有一个非常甜蜜的图书馆 pip install --user tmuxp
将〜/ .local / bin /添加到$ PATH for python用户安装程序
-
# ~/.tmuxp/workbench.yaml
session_name: workbench
windows:
- name: workbench
layout: main-vertical
panes:
- vim
- pane
- pane
-
tumxp load workbench
答案 4 :(得分:2)
我不能为我的生活让-c工作,所以我通过创建一个通过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"