web-dev-qa-db-fra.com

Comment démarrer tmux avec plusieurs fenêtres dans différents répertoires?

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?

33
Michael Härtl

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):

  • Mettez 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.
  • Une fois que vous savez quel fichier est traité lorsque les erreurs se produisent, ajoutez plus de sorties de débogage autour de chaque "bloc majeur" ou ligne pour affiner la section/ligne responsable.
  • Les erreurs ne se trouvent peut-être pas dans votre fichier de démarrage lui-même, mais dans un script qu'il exécute.

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).

19
Chris Johnsen

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.

30
Will

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.

9
Sam Stoelinga

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
6
ThorSummoner

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"
2
Neil McGill