Cách tạo phiên tmux mới nếu không tồn tại


144

Tôi đang cố gắng tìm ra cách gắn vào một tmux sessionphiên tmux có tên, nếu không tôi muốn tạo một cái mới với tên đã cho.

Hiện tại, tôi biết một vài tmuxlệnh có thể đạt được một phần những gì tôi đang tìm kiếm, nhưng không rõ làm thế nào để kết hợp chúng lại với nhau để có được thứ tôi đang tìm kiếm:

  • tmux attach đính kèm với phiên hiện có tự động - nhưng lỗi nếu không có phiên nào tồn tại
  • tmux new tạo một phiên mới - nhưng nó luôn diễn ra như vậy, vì vậy tôi không thể để nó trong phiên .tmux.conf
  • tmux has-session kiểm tra xem một phiên có tồn tại hay không - nhưng tôi không biết cách kết hợp nó với các lệnh khác

Vì vậy, tôi muốn tạo một tập lệnh tmux, để điều này tự động xảy ra, thay vì phải tự tạo nó mỗi khi tôi cần đăng nhập vào một phiên.

Làm cách nào tôi có thể viết tập lệnh tự động để tạo phiên tmux mới (nếu tên phiên đã cho không tồn tại) hoặc đính kèm vào tên phiên (nếu nó tồn tại)?


15
@kzh: Tôi xem nó như một câu hỏi về công cụ lập trình, như vim
hung hăng

6
Tôi đã viết một câu trả lời khả dĩ khác cho câu hỏi này như một ý chính, trong trường hợp bất kỳ ai quan tâm: gist.github.com/chakrit/5004006
chakrit

9
Trong khi đó, tôi man tmuxnói: "Cờ -A làm cho phiên mới hoạt động giống như phiên đính kèm nếu tên phiên đã tồn tại"
Petr Viktorin

1
Đối với những người gắn cờ để di chuyển điều này, tôi nên lưu ý rằng ngay cả người kiểm duyệt cũng không thể di chuyển các câu hỏi hơn 60 ngày tuổi sang một trang web khác. Những lý do cho giới hạn hệ thống này được giải thích ở đây .
Brad Larson

1
@BradLarson, hiện tại, tùy chọn tốt nhất / đơn giản nhất để thực hiện việc này được trả lời trong một bình luận, cách xuống: stackoverflow.com/questions 43232536 / Lỗi . Hầu hết người dùng đến đây sẽ không thể tìm thấy điều này. Đây rõ ràng là một câu hỏi rất quan trọng mà bạn có thể thấy qua số phiếu bầu. Có thể mở câu hỏi này không, vì vậy tôi có thể thêm nó dưới dạng câu trả lời, để những người mới có thể tìm thấy câu hỏi này?
alpha_989

Câu trả lời:


89

Thay phiên, bạn có thể thêm

new-session

đến của bạn .tmux.conf- điều đó sẽ tạo ra một phiên mặc định khi máy chủ bắt đầu.

Sau đó, tmux attachsẽ đính kèm vào phiên hiện tại (nghĩa là máy chủ đang chạy) hoặc tạo một phiên mới (khởi động máy chủ, đọc tệp cấu hình, phát new-sessionlệnh) và đính kèm vào đó.


3
Khi điều này tạo ra một phiên mới, đường dẫn mặc định là thư mục chính của tôi, không phải là đường dẫn mà tmux được gọi.
Richard Hansen

2
@AB: ý bạn là câu trả lời nào?
Jürgen A. Erhard

Có cách nào để giải quyết vấn đề này @ RichardHansen không? Gọi từ con đường hiện tại dường như có ý nghĩa nhất, và nếu new-sessionphá hủy điều đó thì đó dường như là một vấn đề thực sự.
Lee Olayvar

2
Điều này phá vỡ cấu hình tải lại tmux trong trường hợp bạn sử dụng nó ( source-file ~/.tmux.conf)
Sebastian Blask

11
@SebastianBlask bạn có thể sử dụng -Atùy chọn new-sessionnếu bạn đặt tên cho phiên của mình. new-session -A -s mysessionsẽ chơi độc đáo với tải lại cấu hình.
jkoelker 22/03/2016

163

Tôi đã tìm ra nó ( và đã chỉ ra cho tôi ).

tmux attach || tmux new

28
Câu trả lời này hoạt động tốt hơn đối với tôi vì tôi có thể đặt tên cho phiên : tmux attach-session -t my-session || tmux new-session -s my-session. Vấn đề duy nhất là đây không phải là nguyên tử. tmux thực sự nên có một lệnh tạo hoặc đính kèm.
Andrew

5
Tôi có bí danh tiếp theo trong bash -alias tm='tmux attach || tmux new'
azat

10
Nâng cấp vì với một tinh chỉnh nhỏ, điều này hoạt động với các phiên được đặt tên : tmux attach -t some_name || tmux new -s some_name. Thay đổi some_name thành $ 1 thêm shebang và lưu.
Cheezmeister

10
Chú ý đến những người không quen với tmux và tự hỏi về newvs new-session: họ là từ đồng nghĩa, và như vậy là attachattach-session.
Esteis

1
tmux new-session -ds default \; split-window -dv 2>/dev/null; tmux attach -t defaulthoạt động tốt hơn nhiều và không mở tmux thứ hai trong trường hợp bạn /bin/killlà cái đầu tiên. Nhược điểm duy nhất là bạn cần đặt tên cho các phiên cho việc này.
Tino

64

Như đã chỉ ra trong các nhận xét từ Petr Viktorin , jkoelkerpjincz , bạn có thể sử dụng lệnh sau để đính kèm mySessionnếu nó tồn tại và để tạo nó nếu nó không:

 tmux new -A -s mySession

Từ man tmux:

new-session[-AdDEP] [-cstart-directory] [-Fformat] [-nwindow-name] [-ssession-name] [-tgroup-name] [-xwidth] [-yheight] [shell-command]

(bí danh new:)

Tạo một phiên mới với tên session-name.

[...]

Các -Acờ khiến new-sessioncư xử như attach-sessionnếu session-nameđã tồn tại; trong trường hợp này, -Dhoạt động như -dđểattach-session .

new-sessionđã hỗ trợ -Akể từ tmux-1.8 .


1
Nếu bạn định sử dụng điều này trong một cái gì đó giống gnome-terminalnhư lệnh tôi khuyên bạn nên bỏ tên -svà phiên phiên cụ thể để bạn không kết thúc với MỌI gnome-terminalphiên mới được đính kèm trong cùng một phiên. Bạn luôn có thể chọn một phiên hiện có prefix + ssau khi mở một thiết bị đầu cuối mới.
dragon788

14

Mặc dù tôi thấy câu trả lời của hung hăng là đủ để sử dụng 1 phiên, tập lệnh này cho phép bạn thiết lập nhiều phiên:

SESSIONS="work play"

function has-session {
    tmux has-session -t $1 2>/dev/null
}

function except 
{
    if [ "$?" -eq 1 ] ; then
        $1
    fi
}

# Configure your sessions here
function session-work
{
    tmux new-session -d -s work
    tmux neww -k -t work:1
}

function session-play
{
    tmux new-session -d -s play
    tmux neww -k -t play:1
}

#
#MAIN 
for x in $SESSIONS
do
    echo $x
    has-session $x
    except session-$x
done

GHI CHÚ:

-k  --> new-window will not be created if already exists
-d  --> start session or window, but don't attach to it yet
-s  --> name the session
-t  --> specify a target location in the form session:window.pane 

13

Điều chỉnh đề xuất của Alex để bao gồm cấu hình dựa trên dự án khi khởi động, tôi bắt đầu sử dụng như sau:

# ~/bin/tmux-myproject shell script
# The Project name is also used as a session name (usually shorter)
PROJECT_NAME="myproject"
PROJECT_DIR="~/myproject"

tmux has-session -t $PROJECT_NAME 2>/dev/null
if [ "$?" -eq 1 ] ; then
    echo "No Session found.  Creating and configuring."
    pushd $PROJECT_DIR
    tmux new-session -d -s $PROJECT_NAME
    tmux source-file ~/bin/tmux-${PROJECT_NAME}.conf
    popd
else
    echo "Session found.  Connecting."
fi
tmux attach-session -t $PROJECT_NAME

nơi tmux-myproject.conflà loạt khởi động của tôi tmux lệnh để tạo ra các cửa sổ và khung của tôi, cũng như bắt đầu biên tập viên của tôi.


8

Tôi sử dụng bí danh để tạo phiên mới nếu cần và đính kèm vào phiên mặc định của mình nếu nó đã tồn tại:

alias tmuxre='tmux new-session -t default || tmux new-session -s default'

Tôi đã thêm nó vào .login của tôi trên máy chủ của tôi.

Lý do tôi làm theo cách này là vì tôi không muốn đính kèm vào cùng một phiên thực tế, tôi muốn một phiên mới sử dụng cùng một nhóm các cửa sổ.

Điều này cũng tương tự như chạy screen -xRR.


2
Nếu bạn thường xuyên vào và ra khỏi phiên của mình, điều này sẽ để lại rất nhiều phiên không sử dụng, như đã thấy tmux list-sessions.
Anm

Vâng, nó có, tôi chỉ cần làm sạch chúng mọi lúc mọi nơi. Đó là một nhược điểm nhỏ để có được chức năng tôi muốn.
Michael

Hey @ mateusz-piotrowski - Tôi đồng ý với chỉnh sửa để bọc mã của tôi trong một khối mã nhưng tại sao bạn lại chỉnh sửa văn bản khác để khác với những gì tôi đã nói? Xin lỗi để bình luận ở đây nhưng tôi đã không thấy bất cứ nơi nào khác để.
Michael

Tôi không có ý xúc phạm bạn. Tôi chỉ nghĩ rằng bạn không thể chạy một bí danh trong một tập tin cấu hình và vì vậy nó phải là một lỗi đánh máy.
Mateusz Piotrowski

3
Đến bây giờ, bạn chỉ có thể gõ: tmux new -A -s defaultđể khởi chạy một phiên mới nếu nó không tồn tại hoặc đính kèm tự động. Tôi nghĩ rằng nó tốt hơn nhiều so với chỉnh sửa tập tin cấu hình.
pjincz

1

Đối với những người muốn làm điều tương tự trong fish :

tmux attach -t mysesh; or tmux new -s mysesh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.