2011-12-16 9 views
28

Chcę użyć skryptu do otwarcia sesji tmux z 6 oknami, każdy w innym katalogu. Zacząłem a script I found i starał ten pierwszy:Jak uruchomić tmux z kilkoma oknami w różnych katalogach?

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

Ale wkrótce okazało się, że to nie będzie działać, jak się spodziewałem - okno zostanie zamknięte po dopełnia poleceń powłoki.

Więc mój następny pomysł był aby rozpocząć nową powłokę tak:

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 

To prawie działa. Ale jeśli zacznę więcej niż około 4 oknami, ja często zobaczyć następujące błędy bash w jednym z okien po starcie:

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 

Nie mam pojęcia, dlaczego tak się dzieje, ale nadal uważam, że nie robię to prawo. Czy istnieje lepszy sposób na skonfigurowanie sesji tmux w kilku katalogach?

+2

Prawdopodobnie niektóre niecytowane zmienne w .bashrc lub podobnie produkują spacje w zmiennych.Jeśli masz kod taki jak 'if [[-f $ {plik}]]; ... 'i file =" filename w spaces ", spowoduje to wysadzenie w powietrze (podobnie jak w przypadku zmiennych, nie tylko vars plików). 'set -vx' jest twoim przyjacielem. Powodzenia. – shellter

+0

Dzięki, wydaje się, że masz rację. Jedna z linii ofensywnych w moim '.bashrc' wydaje się być' [-x/usr/bin/lesspipe] && eval "$ (SHELL =/bin/sh lesspipe)" '. Jeśli go skomentuję, błąd zniknie. Mimo że nadal nie rozumiem, na czym polega problem: dzieje się tak tylko w jednym z 6 okien. I nawet za każdym razem, gdy tworzę sesję tmux. –

+0

hm ... to nie jest rodzaj przestrzeni, o której myślałem, to nie jest wartość zmiennej, ale podstawienie polecenia, tj. '$ (POWŁOKA ....)' i spacje są tam w porządku. Więc ... często brakujący cytat (pojedynczy lub dbl) powyżej linii, która jest pokazywana jako błąd, spowoduje takie problemy. Jeśli chcesz umieścić swój plik .bashrc, aby wkleić bin i edytować wiadomość z linkiem do niego, prawdopodobnie możemy rozwiązać ten problem. Powodzenia. – shellter

Odpowiedz

15

Błędy powłoki są prawdopodobnie spowodowane pewnym problemem w plikach startowych (lub czymś, co uruchamiają).

Skomentował komentarz tymczasowy, zawierający tymczasowo komendę set -vx we wczesnej fazie uruchamiania, która jest dobrym sposobem, aby dowiedzieć się, gdzie występują błędy.
Jeśli znajdziesz wyjście -vx zbyt rozwlekły, można spróbować „printf debugowanie” (ręczne dodanie oświadczenia debugowania do plików startowych aż można zawęzić dokładnie, które linie są przyczyną błędów):

  • Put echo start of .bashrc i echo end of .bashrc na początku/końcu numeru .bashrc, aby sprawdzić, czy błąd wystąpi podczas Twojego .bashrc. Jeśli nie, użyj innych plików startowych: .bash_profile/.bash_login/.profile. Jeśli błędy wystąpią przed tym plikiem, problem może być w /etc/profile.
  • Gdy wiesz, który plik jest przetwarzany w momencie wystąpienia błędów, dodaj więcej wyników debugowania wokół każdego "głównego bloku" lub linii, aby zawęzić odpowiedzialną sekcję/linię.
  • Błędy mogą nie znajdować się w pliku startowym, ale w skrypcie, który uruchamia.

Uwaga: Te dodatki debugowania muszą mieć charakter tymczasowy, ponieważ może to spowodować problemy, jeśli kiedykolwiek użyć programu sprawia, że ​​zautomatyzowane logowania (np rsync, SSH oparte dostęp Git, itd.), Ponieważ te programy się spodziewać "Czyste" połączenie bez takiego szumu debugującego.


Nie powinno być potrzeby korzystania z polecenia cd tak w powłoki poleceń danego argumentu albo tmux new-session lub tmux new-window.

się nowe okno „dziedziczą” bieżącego katalogu roboczego podczas korzystania new-session i new-window z linii poleceń (czyli po zakończeniu poprzez tmux binarny, zamiast poprzez wiążącą lub w tmux - wierszu :).Zgodnie z plikiem CHANGES wygląda to tak, jak od tmux 0.6 (przynajmniej dla new-window).

To tmux których pośredniczy dziedziczenie, dziedziczenie nie rodzic-dziecko, które jest zwykle mechanizm przechodzenia wzdłuż CWD.

Ten skrypt działa na mnie z 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" 

Może to również (jako efekt uboczny) łagodzić swoje błędy startowe powłoki od sposobu tmux zaczyna powłoki różni się od zwykły bash -i (jest bardziej zbliżony do bash -l, który używa twojego .bash_profile/.bash_login/.profile zamiast (tylko) twojego .bashrc).

+0

Dzięki, twoje rozwiązanie działa dobrze. I tak, to oczywiście również naprawia błędy uruchamiania otrzymane z bash. –

+2

Opcja 'default-path' nie jest dostępna w systemie tmux w wersji 1.8. Został usunięty na rzecz używania flagi '-c' - np. 'tmux new-window -t" $ sn: $ ​​i "-c"/some/path "' – hooblei

27

jest również bardzo dobre do tego. Zasadniczo utworzyć pliki instalacyjne tak:

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

Następnie można rozpocząć nową sesję z:

mux project_name 

Używam go na chwilę i miałem dobre doświadczenia w przeważającej części .

8

Zamiast tego można użyć Teamocil. Teamocil to proste narzędzie służące do automatycznego tworzenia sesji, okien i paneli w tmux z plikami YAML.

5

Dla tys którzy nie zainstalować Rubytmuxp jest dostępny w Pythonie i obsługuje zarówno pliki konfiguracyjne styl Teamocil i Tmuxinator (zarówno YAML i JSON).

Nie wspominając, jest bardzo słodki biblioteka za nim wszyscy https://github.com/tony/libtmux


pip install --user tmuxp 

add ~/.local/bin/do $ PATH dla użytkownika Pythona instalować programy

-

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

-

tumxp load workbench 
0

nie mogę dla życia mnie dostać -c do pracy, więc pracowałem nad tym, tworząc skrypt, który jest uruchamiany przez wysyłanie - to pozwala mi robić, co chcę w każdej sesji tmux. W przypadku, gdy pomaga komuś innemu, tutaj jest:

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