Đính kèm vào phiên tmux và chạy lệnh


6

Làm cách nào tôi có thể chạy một lệnh trong Tmux khi tôi đính kèm vào một phiên?

Tôi muốn đính kèm và ngay lập tức chạy một lệnh.

Tôi đọc tài liệu, nhưng chỉ thấy gửi chìa khóa, không phù hợp với nhu cầu của tôi.


Tôi tự hỏi những gì bạn mong đợi sẽ xảy ra nếu, ví dụ, phiên tmux bạn đính kèm sẽ xảy ra vi.
Falcon Momot

Nó sẽ chỉ chạy bash
astropanic

Câu trả lời:


9

Bạn có thể đính kèm vào một phiên tmux đang chạy và sinh ra một cửa sổ mới chạy một lệnh cụ thể:

tmux attach \; new-window vim

Lưu ý rằng điều này không sinh ra vim trong cửa sổ xuất hiện trước - không có cơ sở để làm điều đó, nó không thực sự có ý nghĩa: như @Falcon Momot chỉ ra, một cửa sổ hiện tại có thể chạy bất cứ thứ gì, cách duy nhất để phát hành lệnh là "gửi phím".


3
Câu trả lời chính xác! Điều này phải rõ ràng đối với hầu hết các độc giả, nhưng tôi phải mất một thời gian để nhận ra nó, vì vậy trong trường hợp bất kỳ ai khác có cùng một câu hỏi: đó \;là một dấu chấm phẩy thoát, được sử dụng ở đây để tách hai tmuxlệnh (không thoát khỏi dấu chấm phẩy new-windowssẽ được coi là một lệnh shell mới).
Joe

3

Hãy thử điều này để chạy mutt, ví dụ

tmux has-session -t mail
if [ $? != 0 ]
then
tmux new-session -s mail -n mel_GMAIL -d "TERM=xterm-256color ; mutt -F $HOME/.mutt/muttrc_perso"
fi
lxterminal --command="tmux attach -t mail"

Nó kiểm tra sự tồn tại của một phiên 'mail' đang chạy, nếu không, nó sẽ tạo một phiên và bắt đầu ứng dụng mutt; cuối cùng nó gắn vào nó


3

Tôi đã tìm kiếm một giải pháp cho vấn đề chính xác này. Nó có thể được thực hiện bằng cách sử dụng các lệnh 'set-buffer' và 'paste-buffer'

tmux att -t <session-name> \; set-buffer "<command>^M" \; paste-buffer

Dưới đây là một ví dụ hoàn chỉnh:

# let's start with two sessions running bash
tmux new -s theOtherSession \; detach
tmux new -s astropanic \; rename-window main-window \; detach

# attach to the 'astropanic' session, run a directory listing, output
# current datetime, then detach. Note for carriage return (^M) type ^V^M
tmux att -t astropanic \; find-window main-window \; set-buffer "ls;date^M" \; paste-buffer \; detach

# reconnect to check status
tmux att -t astropanic

1
Tôi đã không quản lý để làm carriage returnnhư bạn nói. Tôi đã phải gửi khóa enter như thế này : tmux attach -t "$1" \; set-buffer "ls;date" \; paste-buffer \; send-keys C-m.
Alex Palcuie

1
Đây phải là câu trả lời được chấp nhận. Về cơ bản, bạn nên đặt tên cho một cửa sổ và tạo tên dính bằng cách thêm DISABLE_AUTO_TITLE="true"vào hồ sơ shell của bạn (điều này rất quan trọng), sau đó chỉ sử dụng cửa sổ này để chạy các lệnh khi kết nối. Tôi sử dụng nó để kết nối với một máy chủ ssh và sau đó nhận được vé kerberos của tôi vào đầu ngày. ssh hostname -t "tmux a -t 0 \; select-window -t cmd \; set-buffer \"kinit -f -l 1d -r 30d^M\" \; paste-buffer \;". Để thuận tiện, đặt cho nó một cái tên đẹp và lưu nó dưới dạng một tập lệnh trong đường dẫn của bạn. :) Cũng lưu ý ^ M nên được chèn bằng cách nhấn Cv sau đó Enter trong trình chỉnh sửa của bạn.
Gaurav

2

Tôi không rõ loại lệnh nào bạn muốn chạy, lệnh tmux hoặc lệnh shell / OS. Đây là một ví dụ về mỗi:

#!/bin/bash

cd

# give the session a name; makes it easier to reuse code lines
_SNAME=Generic

# start a whole new tmux session
tmux new-session -s $_SNAME -d -x 140 -y 35

# can set tmux options
tmux set-option -t $_SNAME default-path /opt/foo/build

# create a new window that's just a shell
tmux new-window -t $_SNAME -n build -d

# create a new window that's running a program
tmux new-window -t $_SNAME -n vim -d vim

Điều này làm cho phiên không bị cản trở. Nếu bạn cũng muốn đính kèm với nó, hãy thêm dòng này vào cuối tập lệnh shell:

# attach to the new session
tmux attach -t $_SNAME

1

Đây là một đoạn script nhỏ bắt đầu hoặc đính kèm vào Tmux và chạy một lệnh trong đó. Khi lệnh đã được thực thi, nó sẽ thoát Tmux.

#!/bin/sh -x
SESSION_NAME=foo

tmux has-session -t $SESSION_NAME 2>/dev/null
if [ $? -ne 0 ]
then
  tmux new-session -d -s $SESSION_NAME "$*"
fi
exec tmux attach -t $SESSION_NAME

Ví dụ sử dụng:

$ ./script-above 'echo hello world && sleep 10'

0

Tôi thích làm điều này:

#!/bin/bash

function tmuxed {
    /usr/local/bin/tmux new-session -d -s bkp 2&>/dev/null
    /usr/local/bin/tmux send-keys "/Users/xxx/bin/thisscript backup" C-m
}

function backup {
    echo 'bla bla doing stuff'
}

$1

Và chạy /Users/xxx/bin/thisscript tmuxed

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.