2011-12-16 17 views
28

Tôi muốn sử dụng tập lệnh để mở phiên tmux với 6 cửa sổ, mỗi cửa sổ trong một thư mục khác. Tôi bắt đầu với a script I found và cố này đầu tiên:Làm thế nào để bắt đầu tmux với một số cửa sổ trong các thư mục khác nhau?

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

Nhưng tôi sớm phát hiện ra rằng điều này sẽ không làm việc như tôi mong đợi - cửa sổ sẽ đóng cửa sau khi lệnh hoàn thành vỏ.

Vì vậy, ý tưởng tiếp theo của tôi là để bắt đầu một vỏ mới như thế này:

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 

này gần như hoạt động. Nhưng nếu tôi bắt đầu nhiều hơn 4 cửa sổ, tôi thường thấy các lỗi bash sau trong một trong các cửa sổ sau khi khởi động:

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 

Tôi không biết tại sao điều này xảy ra, nhưng tôi vẫn nghĩ rằng tôi không làm quyền này. Có cách nào tốt hơn để thiết lập một phiên tmux qua một số thư mục?

+2

Có thể một số biến không được xác định trong .bashrc hoặc tương tự tạo ra khoảng trắng trong các biến.Nếu bạn có mã như 'if [[-f $ {file}]]; ... 'và file =" tên tập tin w dấu cách ", điều này sẽ thổi những thứ lên (tương tự cho bất kỳ biến, không chỉ tập tin vars). 'set -vx' là bạn của bạn. Chúc may mắn. – shellter

+0

Cảm ơn, bạn có vẻ đúng. Một đường tấn công trong '.bashrc' của tôi có vẻ là' [-x/usr/bin/lesspipe] && eval "$ (SHELL =/bin/sh lesspipe)" '. Nếu tôi nhận xét nó, lỗi sẽ biến mất. Mặc dù tôi vẫn không hiểu vấn đề thực sự là gì: Nó chỉ xảy ra ở 1 trong số 6 cửa sổ. Và thậm chí không phải lúc nào tôi cũng tạo phiên tmux. –

+0

hm ... đó không phải là loại không gian tôi đã nghĩ đến, đó không phải là một giá trị biến, nhưng một sự thay thế lệnh, tức là '$ (SHELL ....)' và dấu cách là OK. Vì vậy, ... thường là một trích dẫn mất tích (đơn hoặc dbl) trên dòng được hiển thị như là một lỗi sẽ gây ra vấn đề như thế này. Nếu bạn quan tâm để đăng .bashrc của bạn để dán bin và chỉnh sửa tin nhắn của bạn với một liên kết đến nó, chúng tôi có thể có thể giải quyết này. Chúc may mắn. – shellter

Trả lời

15

Lỗi vỏ có thể do một số sự cố trong tệp khởi động của bạn (hoặc một cái gì đó chúng chạy).

Khi trình duyệt shellter nhận xét, tạm thời bao gồm lệnh set -vx sớm trong chuỗi khởi động của bạn là một cách hay để tìm ra nơi xảy ra lỗi.
Nếu bạn tìm thấy những -vx đầu ra quá tiết, bạn có thể thử “printf gỡ lỗi” (bằng tay thêm báo cáo debug các tập tin khởi động của bạn cho đến khi bạn có thể thu hẹp chính xác dòng đang gây ra lỗi):

  • Đặt echo start of .bashrcecho end of .bashrc ở đầu/cuối của .bashrc để xem lỗi có xảy ra trong .bashrc hay không. Nếu không, hãy ghi các tệp khởi động khác của bạn: .bash_profile/.bash_login/.profile. Nếu lỗi xảy ra trước tệp đó, thì sự cố có thể ở trong /etc/profile.
  • Khi bạn biết tệp nào đang được xử lý khi xảy ra lỗi, hãy thêm các đầu ra gỡ lỗi khác xung quanh mỗi "khối chính" hoặc dòng để thu hẹp phần/dòng chịu trách nhiệm.
  • Các lỗi có thể không thực sự nằm trong tệp khởi động của bạn, nhưng trong một tập lệnh mà nó chạy.

Lưu ý: Những bổ sung debug cần phải tạm thời vì chúng sẽ gây ra vấn đề nếu bạn đã từng sử dụng một chương trình mà làm cho thông tin đăng nhập tự động (ví dụ rsync, SSH truy cập dựa trên Git, vv) từ các chương trình này mong đợi một "Sạch" kết nối mà không có tiếng ồn gỡ lỗi như vậy hiện nay.


Không nên có nhu cầu sử dụng cd lệnh như thế trong vỏ lệnh luận trao cho một trong hai tmux new-session hoặc tmux new-window.

Một cửa sổ mới sẽ “kế thừa” thư mục làm việc hiện nay khi sử dụng new-sessionnew-window từ dòng lệnh (tức là khi thực hiện thông qua tmux nhị phân, thay vì thông qua một liên kết hoặc tại một tmux - nhắc :).Theo tệp CHANGES, có vẻ như đây là trường hợp kể từ tmux 0.6 (ít nhất là cho new-window).

Đây là tmux thừa kế qua trung gian, không phải là thừa kế cha-con đó là cơ chế thông thường cho đi dọc theo cwd.

Kịch bản này làm việc cho tôi với 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" 

này cũng có thể (như là một tác dụng phụ) làm giảm bớt lỗi khởi động shell của bạn kể từ khi cách tmux bắt đầu một vỏ là khác nhau từ một plain bash -i (nó giống với bash -l, sử dụng .bash_profile/.bash_login/.profile thay vì (chỉ) .bashrc) của bạn.

+0

Cảm ơn, giải pháp của bạn hoạt động tốt. Và có, điều này tất nhiên cũng sửa lỗi khởi động tôi nhận được từ bash. –

+2

Tùy chọn 'default-path' không có sẵn trong tmux 1.8. Nó đã bị xóa để ủng hộ việc sử dụng cờ '-c' - ví dụ: 'tmux new-window -t" $ sn: $ ​​i "-c"/một số/đường dẫn "' – hooblei

27

Tmuxinator cũng thực sự tốt cho việc này. Về cơ bản bạn tạo tập tin cài đặt như sau:

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

Sau đó, bạn có thể bắt đầu một phiên làm việc mới với:

mux project_name 

Tôi đã sử dụng nó trong một thời gian và đã có một kinh nghiệm tốt cho hầu hết các phần .

8

Thay vào đó, bạn có thể sử dụng Teamocil. Teamocil là một công cụ đơn giản được sử dụng để tự động tạo các phiên, cửa sổ và các khung trong tmux với các tệp YAML.

5

Đối với Nghìn người không cài đặt ruby ​​tmuxp có sẵn bằng Python và hỗ trợ cả tệp cấu hình kiểu Teamocil và Tmuxinator (trong cả yaml và json).

Chưa kể có một thư viện rất ngọt ngào đằng sau nó tất cả https://github.com/tony/libtmux


pip install --user tmuxp 

add ~/.local/bin/đến $ PATH của bạn cho người dùng python cài đặt chương trình

-

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

-

tumxp load workbench 
0

tôi có thể không cho cuộc sống của tôi có được -c để làm việc, vì vậy tôi đã làm việc xung quanh điều này bằng cách tạo ra một kịch bản được chạy qua gửi - điều này cho phép tôi làm bất cứ điều gì tôi muốn trong mỗi phiên tmux. Trong trường hợp nó giúp người khác, ở đây là:

#!/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" 
Các vấn đề liên quan