2011-12-16 6 views
28

Voglio usare uno script per aprire una sessione tmux con 6 finestre, ognuna in una directory diversa. Ho iniziato con a script I found e provato questa prima:Come avviare tmux con diverse finestre in diverse directory?

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

Ma presto scoperto che questo non funziona come mi aspettavo - la finestra sarà chiusa dopo il completamento del comando di shell.

Quindi la mia prossima idea era quella di avviare una nuova shell in questo modo:

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 

Questo quasi funziona. Ma se mi metto più di circa 4 finestre, ho spesso vedere i seguenti errori bash in una delle finestre dopo l'avvio:

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 

Non ho idea del perché questo accade, ma io continuo a pensare che non sto facendo questo giusto C'è un modo migliore per impostare una sessione tmux su più directory?

+2

È probabile che alcune variabili non quotate in .bashrc o simili producano spazi in variabili.Se hai un codice come 'if [[-f $ {file}]]; ... 'e file =" nome file w spazi ", questo farà esplodere le cose (simile a qualsiasi variabile, non solo ai file vars). 'set -vx' è tuo amico. In bocca al lupo. – shellter

+0

Grazie, sembra che tu abbia ragione. Una riga offensiva nel mio '.bashrc' sembra essere' [-x/usr/bin/lesspipe] && eval "$ (SHELL =/bin/sh lesspipe)" '. Se commento, l'errore scompare. Anche se non riesco ancora a capire qual è il problema: succede solo in 1 delle 6 finestre. E nemmeno ogni volta che creo la sessione tmux. –

+0

hm ... non è il tipo di spazio a cui stavo pensando, che non è un valore di variabile, ma una sostituzione di comando, ad esempio '$ (SHELL ....)' e gli spazi sono OK lì. Quindi ... spesso una citazione mancante (singola o dbl) sopra la linea che viene visualizzata come un errore causerà problemi come questo. Se ti interessa pubblicare il tuo .bashrc per incollare il cestino e modificare il tuo messaggio con un link, probabilmente possiamo risolvere questo problema. In bocca al lupo. – shellter

risposta

15

Gli errori di shell sono probabilmente dovuti a qualche problema nei file di avvio (o qualcosa che eseguono).

Come ha commentato lo shellter, includere temporaneamente il comando set -vx nella sequenza di avvio è un buon modo per scoprire dove si verificano gli errori.
Se si trova il -vx uscita troppo prolisso, si potrebbe provare a “debug printf” (aggiungere manualmente istruzioni di debug per i file di avvio fino a quando si può circoscrivere esattamente quali linee stanno causando gli errori):

  • Put echo start of .bashrc e echo end of .bashrc all'inizio/fine del tuo .bashrc per vedere se l'errore si verifica durante il tuo .bashrc. In caso contrario, strumenti gli altri file di avvio: .bash_profile/.bash_login/.profile. Se gli errori si verificano prima di quel file, il problema potrebbe essere in /etc/profile.
  • Una volta individuato il file che viene elaborato quando si verificano gli errori, aggiungere più uscite di debug attorno a ciascun "blocco principale" o linea per restringere la sezione/linea responsabile.
  • Gli errori potrebbero non essere effettivamente nel file di avvio stesso, ma in uno script che viene eseguito.

Nota: queste le aggiunte di debug devono essere temporaneo dal momento che verranno causare problemi se mai utilizza un programma che rende gli accessi automatizzati (ad es rsync, SSH-based accesso Git, ecc) in quanto questi programmi si aspettano una Connessione "pulita" senza tale rumore di debugging presente.


Non ci dovrebbe essere necessario utilizzare cd comando come quello nella shell comando argomento fornito a uno o tmux new-sessiontmux new-window.

una nuova finestra “erediterà” la directory di lavoro corrente quando si utilizza new-session e new-window dalla riga di comando (cioè quando fatto attraverso il tmux binario, invece che tramite un'associazione o ad un tmux - pronta :).Secondo il file CHANGES, sembra che questo sia stato il caso dal tmux 0.6 (almeno per new-window).

Questo è tmux eredità mediata, non l'eredità genitore-figlio che è il solito meccanismo per passare lungo la CWD.

Questo script funziona per me 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" 

Questo potrebbe anche (come un effetto collaterale) alleviare i errori di avvio della shell in quanto il modo in cui tmux avvia una shell è diverso da un semplice bash -i (è più simile a bash -l, che utilizza lo .bash_profile/.bash_login/.profile anziché (solo) il .bashrc).

+0

Grazie, la tua soluzione funziona bene. E sì, questo ovviamente corregge anche gli errori di avvio che ho ricevuto da bash. –

+2

L'opzione 'percorso-predefinito' non è disponibile in tmux passato 1.8. È stato rimosso a favore dell'uso del flag '-c' - ad es. 'tmux new-window -t" $ sn: $ ​​i "-c"/alcuni/percorso "' – hooblei

27

Tmuxinator è anche molto buono per questo. In sostanza si crea file di installazione in questo 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] 

allora si può iniziare una nuova sessione con:

mux project_name 

ho usato per un po 'e hanno avuto una buona esperienza per la maggior parte .

8

È possibile utilizzare invece Teamocil. Teamocil è un semplice strumento utilizzato per creare automaticamente sessioni, finestre e riquadri in tmux con i file YAML.

5

Per thous che non installa ruby ​​tmuxp è disponibile in Python e supporta sia i file di configurazione in stile Teammil che Tmuxinator (sia in yaml che json).

Per non parlare c'è una biblioteca molto dolce dietro a tutto https://github.com/tony/libtmux


pip install --user tmuxp 

add ~/.local/bin/al tuo $ PATH per utente pitone installare programmi

-

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

-

tumxp load workbench 
0

non ho potuto per la vita di me ottenere -c per funzionare, quindi ho lavorato su questo creando uno script che è stato eseguito tramite send - questo mi permette di fare tutto ciò che voglio in ogni sessione di tmux. Nel caso in cui aiuti qualcun altro, eccolo:

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