Je veux utiliser un script pour ouvrir une session tmux avec 6 fenêtres, chacune dans un répertoire différent. J'ai commencé avec n script que j'ai trouvé et j'ai essayé ceci en premier:
tmux new-session -s xyz -n etc -d 'cd /etc'
tmux new-window -t xyz:1 -n var 'cd /var/log'
Mais j'ai vite découvert que cela ne fonctionnerait pas comme je m'y attendais - la fenêtre sera fermée une fois la commande Shell terminée.
Donc, ma prochaine idée était de démarrer un nouveau Shell comme celui-ci:
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
Cela fonctionne presque. Mais si je démarre plus de 4 fenêtres environ, je vois fréquemment les erreurs bash suivantes dans l'une des fenêtres après le démarrage:
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
Je ne sais pas pourquoi cela se produit, mais je pense toujours que je ne fais pas cela correctement. Existe-t-il un meilleur moyen de configurer une session tmux sur plusieurs répertoires?
Les erreurs Shell sont probablement dues à un problème dans vos fichiers de démarrage (ou quelque chose qu'ils exécutent).
Comme l'a expliqué Shellter, en incluant temporairement la commande set -vx
au début de votre séquence de démarrage est un bon moyen de savoir où les erreurs se produisent.
Si vous trouvez le -vx
sortie trop verbeuse, vous pouvez essayer le "débogage printf" (en ajoutant manuellement des instructions de débogage à vos fichiers de démarrage jusqu'à ce que vous puissiez préciser exactement quelles lignes sont à l'origine des erreurs):
echo start of .bashrc
et echo end of .bashrc
au début/à la fin de votre .bashrc
pour voir si l'erreur se produit pendant votre .bashrc
. Sinon, instrumentez vos autres fichiers de démarrage: .bash_profile
/.bash_login
/.profile
. Si les erreurs se produisent avant ce fichier, le problème peut provenir de /etc/profile
.Remarque: Ces ajouts de débogage doivent être temporaires car ils causeront des problèmes si vous utilisez un programme qui effectue des connexions automatisées (par exemple rsync, accès Git basé sur SSH, etc.) car ces programmes attendent un " propre "sans présence d'un tel bruit de débogage.
Il ne devrait pas être nécessaire d'utiliser la commande cd
comme celle-ci dans l'argument Shell-command donné à tmux new-session
ou tmux new-window
.
Une nouvelle fenêtre "héritera"† le répertoire de travail actuel lors de l'utilisation de new-session
et new-window
à partir de la ligne de commande (c'est-à-dire lorsqu'il est effectué via le binaire tmux
, au lieu de via une liaison ou à un tmux -:
Invite). Selon le fichier CHANGES, il semble que ce soit le cas depuis tmux 0,6 (au moins pour new-window
).
† C'est tmux - l'héritage médiatisé, pas l'héritage parent-enfant qui est le mécanisme habituel pour transmettre le cwd.
Ce script fonctionne pour moi avec 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"
Cela pourrait également (en tant qu'effet secondaire) atténuer vos erreurs de démarrage du shell, car la façon dont tmux démarre un shell est différent d'un simple bash -i
(cela s'apparente plus à bash -l
, qui utilise votre .bash_profile
/.bash_login
/.profile
au lieu de (juste) votre .bashrc
).
Tmuxinator est également très bon pour cela. Fondamentalement, vous créez des fichiers de configuration comme ceci:
# ~/.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
Ensuite, vous pouvez démarrer une nouvelle session avec:
mux project_name
Je l'utilise depuis un certain temps et j'ai eu une bonne expérience pour la plupart.
Vous pouvez utiliser Teamocil à la place. Teamocil est un outil simple utilisé pour créer automatiquement des sessions, des fenêtres et des volets dans tmux avec des fichiers YAML.
Pour des milliers de personnes qui n'installent pas Ruby tmuxp est disponible dans Python et prend en charge les fichiers de configuration de style Teamocil et Tmuxinator (à la fois dans yaml et json).
Sans oublier qu'il y a une bibliothèque très douce derrière tout cela https://github.com/tony/libtmux
pip install --user tmuxp
ajoutez ~/.local/bin/à votre $ PATH pour python programmes d'installation utilisateur
-
# ~/.tmuxp/workbench.yaml
session_name: workbench
windows:
- name: workbench
layout: main-vertical
panes:
- vim
- pane
- pane
-
tumxp load workbench
Pour la vie de moi, je ne pouvais pas faire fonctionner -c, donc j'ai travaillé autour de cela en créant un script qui est exécuté via send - cela me permet de faire ce que je veux dans chaque session tmux. Au cas où cela aiderait quelqu'un d'autre, voici:
#!/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"