it-swarm-pt.tech

Como iniciar o tmux com várias janelas em diretórios diferentes?

Eu quero usar um script para abrir uma sessão tmux com 6 janelas, cada uma em um diretório diferente. Comecei com m script que encontrei e tentei primeiro:

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

Mas logo descobri que isso não funcionaria como eu esperava - a janela será fechada após a conclusão do comando do Shell.

Então, minha próxima idéia foi iniciar um novo 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

Isso quase funciona. Mas se eu iniciar mais do que cerca de 4 janelas, frequentemente vejo os seguintes erros do bash em uma das janelas após a inicialização:

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

Não tenho ideia do por que isso acontece, mas ainda acho que não estou fazendo isso direito. Existe uma maneira melhor de configurar uma sessão tmux em vários diretórios?

33
Michael Härtl

Os erros do Shell provavelmente são causados ​​por algum problema nos arquivos de inicialização (ou em algo que eles executam).

Como comentou o shellter, incluindo temporariamente o comando set -vx no início da sequência de inicialização é uma boa maneira de descobrir onde os erros estão ocorrendo.
Se você encontrar o -vx saída muito detalhada, você pode tentar “printf debugging” (adicionar manualmente instruções de depuração aos arquivos de inicialização até que você possa restringir exatamente quais linhas estão causando os erros):

  • Colocar echo start of .bashrc e echo end of .bashrc no início/fim do seu .bashrc para ver se o erro ocorre durante o seu .bashrc. Caso contrário, instrumente seus outros arquivos de inicialização: .bash_profile/.bash_login/.profile. Se os erros ocorrerem antes desse arquivo, o problema pode estar em /etc/profile.
  • Depois de saber qual arquivo está sendo processado quando os erros ocorrem, adicione mais saídas de depuração em torno de cada “bloco principal” ou linha para restringir a seção/linha responsável.
  • Os erros podem não estar no seu próprio arquivo de inicialização, mas em um script executado.

Nota: essas adições de depuração precisam ser temporárias, pois causarão problemas se você usar um programa que faça logins automatizados (por exemplo: rsync, acesso ao Git baseado em SSH etc.), pois esses programas esperam um " conexão limpa "sem o ruído de depuração presente.


Não deve haver necessidade de usar o comando cd como esse no argumento Shell-command fornecido a tmux new-session ou tmux new-window.

Uma nova janela "herdará" o diretório de trabalho atual ao usar new-session e new-window na linha de comando (ou seja, quando feito através do binário tmux, em vez de por meio de uma ligação ou em um tmux -: Pronto). De acordo com o arquivo CHANGES, parece que esse tem sido o caso desde tmux 0,6 (pelo menos para new-window).

 Esta é a herança mediada tmux -, não a herança pai-filho que é o mecanismo usual para transmitir ao longo do cwd.

Este script funciona para mim com 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"

Isso também pode (como efeito colateral) aliviar os erros de inicialização do Shell desde que o modo tmux inicia um Shell é diferente de um simples bash -i (é mais parecido com bash -l, que usa seu .bash_profile/.bash_login/.profile em vez de (apenas) seu .bashrc).

19
Chris Johnsen

Tmuxinator também é realmente bom para isso. Basicamente, você cria arquivos de instalação da seguinte forma:

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

Então você pode iniciar uma nova sessão com:

mux project_name

Eu o uso há um tempo e tive uma boa experiência na maior parte.

30
Will

Você pode usar Teamocil em vez disso. O Teamocil é uma ferramenta simples usada para criar automaticamente sessões, janelas e painéis no tmux com arquivos YAML.

9
Sam Stoelinga

Para milhares que não instalam Ruby tmuxp está disponível em Python e suporta os arquivos de configuração de estilo Teamocil e Tmuxinator (em yaml e json)).

Sem mencionar que há uma biblioteca muito agradável por trás de tudo isso https://github.com/tony/libtmux


 pip install --user tmuxp

adicione ~/.local/bin/ao seu $ PATH para python

-

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

-

 tumxp load workbench
6
ThorSummoner

Como não consegui, pela vida toda, -c funcionar, então resolvi isso criando um script que é executado via send - isso me permite fazer o que quiser em cada sessão do tmux. Caso ajude alguém, aqui 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"
2
Neil McGill