2011-12-16 21 views
28

Quiero usar un script para abrir una sesión de tmux con 6 ventanas, cada una en un directorio diferente. Empecé con a script I found y trató primero esto,¿Cómo iniciar tmux con varias ventanas en diferentes directorios?

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

Pero pronto me di cuenta de que esto no va a funcionar como esperaba - la ventana se cerrará después de finalizar el comando shell.

Así que mi siguiente idea era comenzar una nueva shell como esto:

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 

Esto casi funciona. Pero si comienzo a más de unos 4 ventanas, veo con frecuencia los siguientes errores de bash en una de las ventanas después del arranque:

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 

no tengo ni idea de por qué sucede esto, pero sigo pensando que no estoy haciendo este derecho. ¿Hay una mejor manera de configurar una sesión de tmux en varios directorios?

+2

Es probable que alguna variable sin comillas en .bashrc o similar esté produciendo espacios en las variables.Si tiene código como 'if [[-f $ {file}]]; ... 'y file =" filename w spaces ", esto explotará las cosas (similar para cualquier variable, no solo para archivos vars). 'set -vx' es tu amigo. Buena suerte. – shellter

+0

Gracias, parece que tienes razón. Una línea ofensiva en mi '.bashrc' parece ser' [-x/usr/bin/lesspipe] && eval "$ (SHELL =/bin/sh lesspipe)" '. Si lo comento, el error desaparece. Aunque todavía no entiendo cuál es realmente el problema: solo ocurre en 1 de las 6 ventanas. Y ni siquiera cada vez que creo la sesión de tmux. –

+0

hm ... ese no es el tipo de espacio en el que estaba pensando, que no es un valor variable, sino una sustitución de comando, es decir '$ (SHELL ....)' y los espacios están bien allí. Entonces ... a menudo una comilla faltante (simple o doble) sobre la línea que se muestra como un error causará problemas como este. Si le interesa publicar su .bashrc para pegar el contenedor y editar su mensaje con un enlace al mismo, probablemente podamos resolverlo. Buena suerte. – shellter

Respuesta

15

Los errores de shell probablemente se deben a algún problema en los archivos de inicio (o algo que ejecutan).

Como comentó shellter, incluir temporalmente el comando set -vx al comienzo de la secuencia de inicio es una buena forma de averiguar dónde se están produciendo los errores.
Si encuentra la salida -vx demasiado prolijo, puede probar “la depuración de printf” (añadiendo manualmente instrucciones de depuración de los archivos de inicio hasta que se pueda reducir exactamente qué líneas están causando los errores):

  • Deja echo start of .bashrc y echo end of .bashrc al inicio/final de su .bashrc para ver si se produce el error durante su .bashrc. De lo contrario, instrumente sus otros archivos de inicio: .bash_profile/.bash_login/.profile. Si los errores suceden antes de ese archivo, entonces el problema puede estar en /etc/profile.
  • Una vez que sepa qué archivo se está procesando cuando se producen los errores, agregue más salidas de depuración alrededor de cada "bloque principal" o línea para delimitar la sección/línea responsable.
  • Es posible que los errores no estén realmente en su archivo de inicio, sino en un script que se ejecute.

Nota: Estas adiciones de depuración tiene que ser temporal, ya que podrían causar problemas si alguna vez utiliza un programa que hace que los inicios de sesión automatizados (por ejemplo, rsync , acceso Git basado en SSH, etc.), ya que estos programas esperan una Conexión "limpia" sin ese ruido de depuración presente.


No debería haber ninguna necesidad de utilizar cd comando como que en el shell-command argumento dado a cualquiera de tmux new-session o tmux new-window.

una nueva ventana “heredar” el directorio de trabajo actual cuando se utiliza new-session y new-window desde la línea de comandos (es decir, cuando se hace a través de la tmux binario, en lugar de a través de una unión o en una tmux - pronta :)Según el archivo CHANGES, parece que este ha sido el caso desde tmux 0.6 (al menos para new-window).

Esta es tmux herencia mediada, no la herencia padre-hijo que es el mecanismo habitual para pasar a lo largo de la caquexia crónica.

Este script funciona para mí con 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" 

Esto podría también (como un efecto secundario) aliviar sus errores de inicio de la cáscara ya que la forma tmux comienza una concha es diferente de una plain bash -i (es más parecido a bash -l, que usa su .bash_profile/.bash_login/.profile en lugar de (solo) su .bashrc).

+0

Gracias, su solución funciona bien. Y sí, esto también soluciona los errores de inicio que recibí de bash. –

+2

La opción 'default-path' no está disponible en tmux después de 1.8. Se eliminó a favor de utilizar el indicador '-c', p. 'tmux new-window -t" $ sn: $ ​​i "-c"/some/path "' – hooblei

27

Tmuxinator es también muy bueno para esto. Básicamente permite crear archivos de configuración de este modo:

# ~/.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] 

entonces se puede empezar una nueva sesión con:

mux project_name 

He estado usando durante un tiempo y he tenido una buena experiencia en su mayor parte .

8

En su lugar, puede usar Teamocil. Teamocil es una herramienta simple que se usa para crear automáticamente sesiones, ventanas y paneles en tmux con archivos YAML.

5

Para Thous que no instale rubítmuxp está disponible en Python y admite tanto archivos de configuración de estilo Teamocil y Tmuxinator (tanto en yaml y JSON).

Por no hablar de que hay una biblioteca muy dulce detrás de todo https://github.com/tony/libtmux


pip install --user tmuxp 

complemento ~/.local/bin/a tu $ PATH para instalar los programas de usuario pitón

-

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

-

tumxp load workbench 
0

no pude por la vida de conseguirme -c para trabajar, así que trabajé alrededor de esto creando un script que se ejecutó mediante send - esto me permite hacer lo que quiera en cada sesión de tmux. En caso de que ayude a alguien más, aquí está:

#!/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" 
Cuestiones relacionadas