bash - tutorial - ¿Cómo iniciar tmux con varias ventanas en diferentes directorios?
tmux split window (5)
Los errores de shell probablemente se deben a algún problema en los archivos de inicio (o algo que ejecutan).
Como comentó el shellter, incluir temporalmente el set -vx
comandos set -vx
principio de la secuencia de inicio es una buena manera de averiguar dónde están ocurriendo los errores.
Si encuentra que la salida de -vx
es demasiado detallada, podría intentar "debugging printf" (agregando manualmente las declaraciones de depuración a sus archivos de inicio hasta que pueda reducir exactamente qué líneas están causando los errores):
- Coloque el
echo start of .bashrc
y elecho end of .bashrc
al inicio / final de su.bashrc
para ver si el error se produce durante su.bashrc
. Si no,.bash_login
sus otros archivos de inicio:.bash_profile
/.bash_login
/.profile
. Si los errores ocurren antes de ese archivo, entonces el problema puede estar en/etc/profile
. - Una vez que sepa qué archivo se está procesando cuando ocurren los errores, agregue más salidas de depuración alrededor de cada "bloque principal" o línea para reducir la sección / línea responsable.
- Es posible que los errores no se encuentren en su propio archivo de inicio, sino en un script que se ejecuta.
Nota: estas adiciones de depuración deben ser temporales, ya que causarán problemas si alguna vez utiliza un programa que realiza inicios de sesión automatizados (por ejemplo, rsync , acceso a 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 necesidad de usar el comando cd
así en el argumento de comando de shell dado a 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 realiza a través del binario tmux
, en lugar de hacerlo a través de un enlace o en un aviso tmux - :) . Según el archivo CHANGES, parece que este ha sido el caso desde tmux 0.6 (al menos para new-window
).
† Esta es la herencia mediada por tmux , no la herencia padre-hijo, que es el mecanismo habitual para transmitir el cwd.
Este script me funciona 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 también podría (como efecto secundario) aliviar los errores de inicio de su shell, ya que la forma en que tmux inicia una shell es diferente de un bash -i
simple (es más parecido a bash -l
, que usa su .bash_profile
/ .bash_login
/ .profile
lugar de (simplemente) su .bashrc
).
Quiero usar un script para abrir una sesión tmux con 6 ventanas, cada una en un directorio diferente. Comencé con un script que encontré y probé esto primero:
tmux new-session -s xyz -n etc -d ''cd /etc''
tmux new-window -t xyz:1 -n var ''cd /var/log''
Pero pronto descubrí que esto no funcionará como esperaba, la ventana se cerrará una vez que se complete el comando de shell.
Así que mi siguiente idea fue comenzar un nuevo shell como este:
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 más de 4 ventanas, con frecuencia veo los siguientes errores de bash en una de las ventanas después del inicio:
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 idea de por qué sucede esto, pero sigo pensando que no estoy haciendo esto bien. ¿Hay una mejor manera de configurar una sesión tmux en varios directorios?
Por mi vida, no pude hacer que -c funcione, así que resolví esto creando un script que se ejecuta a través del envío. 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"
Tmuxinator también es muy bueno para esto. Básicamente creas archivos de configuración así:
# ~/.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
Luego puedes comenzar una nueva sesión con:
mux project_name
Lo he estado usando por un tiempo y he tenido una buena experiencia en su mayor parte.
Para aquellos que no instalan ruby tmuxp está disponible en Python y es compatible con los archivos de configuración de estilo Teamocil y Tmuxinator (tanto en yaml como en json).
- Fuente tmuxp
- Docs http://tmuxp.readthedocs.io/en/latest/
- Pypi https://pypi.python.org/pypi/tmuxp/1.0.0
Sin mencionar que hay una biblioteca muy dulce detrás de todo https://github.com/tony/libtmux
pip install --user tmuxp
agregue ~ / .local / bin / a su $ PATH para los programas de instalación de usuarios de Python
-
# ~/.tmuxp/workbench.yaml
session_name: workbench
windows:
- name: workbench
layout: main-vertical
panes:
- vim
- pane
- pane
-
tumxp load workbench