Làm cách nào tôi có thể đặt shell mặc định của mình để khởi động tmux


Câu trả lời:


46

Điều này dường như hoạt động ...

https://wiki.archlinux.org/index.php/Tmux#Start_tmux_on_every_shell_login

Chỉ cần thêm dòng mã bash sau vào .bashrc của bạn trước các bí danh của bạn; mã cho các shell khác rất giống nhau:

[[ $TERM != "screen" ]] && exec tmux

2
Đối với tôi điều này cũng được yêu cầu [[ $- != *i* ]] && returnkhông phải là một vòng lặp vô hạn (từ cùng một trang)
Keith Smiley

5
Đây là một giải pháp tồi vì TERMcó thể được đặt thành một số giá trị khác bởi .tmux.conftệp của người dùng . Tốt hơn để kiểm tra xem TMUXbiến được đặt hay không.
Kusalananda

104

Câu trả lời của @ Starer nói chung là chính xác, mặc dù tôi thường bao gồm các thử nghiệm sau để đảm bảo rằng (1) tmux tồn tại trên hệ thống, (2) chúng tôi đang ở trong một vỏ tương tác và (3) tmux không thử chạy trong Chính nó:

if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  exec tmux
fi

Người giới thiệu


1
Thật tuyệt, tôi đã cần commandtrước đây nhưng không nhận ra nó tồn tại.
Freedom_Ben

2
này exectuyên bố không cho phép bạn thoát khỏi tmux mà không thoái toàn bộ thiết bị đầu cuối! : |
Louis Maddox

5
@LouisMaddox: execthay thế quy trình hiện tại bằng quy trình mới - trong trường hợp này, nó thay thế vỏ đăng nhập bash bằng tmux, vì vậy khi tmux thoát thì không có thiết bị đầu cuối nào khác quay trở lại :)
Mark K Cowan

1
@rjt Đúng vậy, điều này bắt đầu một phiên mới theo thiết kế. Nếu bạn muốn đính kèm với phiên tmux hiện tại, chỉ cần thay thế exec tmuxbằng hương vị ưa thích của bạntmux attach
user7089

2
thay vì exec tmuxtôi sử dụng exec tmux new-session -A -s mainvì vậy tôi sẽ luôn có một phiên gọi là chính và đính kèm với nó (thay vì tạo một phiên mới mỗi khi tôi kết nối với máy từ xa của mình) nhưng nó sẽ không gặp sự cố như sử dụng tmux attachtrong trường hợp không có phiên nào (tìm thấy ở đây: unix.stackexchange.com/a/176885/256942 )
Verena Haunschmid

16

Thêm một dòng như

[ -z "$TMUX"  ] && { tmux attach || exec tmux new-session && exit;}

trong tệp bashrc của bạn có thể sẽ thực hiện công việc. Lưu ý dòng này sẽ thoát ssh và chấm dứt kết nối khi bạn tách hoặc thoát tmux. Tôi thích cấu hình này vì nó lưu các nét chính để chấm dứt kết nối. Nhưng nếu bạn không thích điều này (điều mà tôi nghĩ là rất khó xảy ra) và thà ở lại trong vỏ đăng nhập sau khi chấm dứt, chỉ cần xóa exitphần:

[ -z "$TMUX"  ] && { tmux attach || exec tmux new-session;}

Cũng lưu ý bạn không nên quấn tmux attachvới exec, vì điều này sẽ gây ra sự kết nối được đóng cửa khi không có phiên tmux để đính kèm vào.


Tôi đã thêm dòng này vào .bashrc của mình, nhưng bây giờ khi tôi bắt đầu một thiết bị đầu cuối, tôi nhận được một số tin nhắn: /home/z/.tmux.conf:10: không có phiên hiện tại (thông báo lặp lại cho các dòng 11, 13, 14 , 15). Những dòng đó là những thứ như "set default-lệnh" exec bash "" và "set default-terminal" screen-256color ".
Matt G

@MattG Cảm thấy như có gì đó không ổn với tệp cấu hình tmux.
huangzonghao

5

Có lệnh chshthay đổi vỏ đăng nhập. Tham khảo ý kiến man chsh.


6
tmuxkhông phải là một trình bao, nó là một bộ ghép kênh đầu cuối như màn hình GNU. Thật thú vị, nó không hỗ trợ -ctùy chọn theo trang man , vì vậy nó có thể hoạt động như một vỏ chỉ đủ để sử dụng nó làm vỏ đăng nhập của bạn, nhưng tôi nghi ngờ nó sẽ không hoạt động chính xác trong mọi tình huống, ví dụ như đăng nhập đồ họa qua gdm / kdm .
Mikel

1
Mặc dù điều này là hợp lý và được hỗ trợ bởi tài liệu này, nó dường như phá vỡ việc thực thi lệnh trực tiếp thông qua SSH (đại loại như ssh $some_server echo foo).
n.st

3
tmux tính đến ít nhất 1.8 trên Ubuntu tự thêm vào /etc/shells, vì vậy đây là một vỏ đăng nhập hợp lệ.
claytron

2
Điều này yêu cầu bạn định cấu hình default-shellcài đặt trong cấu hình tmux để trỏ đến trình bao thực tế.
Kusalananda

4

Tôi đang sử dụng thành công

case $- in *i*)
    [ -z "$TMUX" ] && exec tmux
esac

trong tôi .zshrc. Nếu bạn đang sử dụng bash, .bashrcthay vào đó hãy đặt nó vào .


Tôi cũng vừa thử cài đặt tmuxlàm shell mặc định ( chsh -s $(which tmux)) và nó dường như phá vỡ việc thực thi lệnh trực tiếp thông qua SSH, ví dụ như ssh $some_server echo foosẽ không tạo ra bất kỳ đầu ra nào.


3

Đi đến ưu tiên thiết bị đầu cuối. nhập mô tả hình ảnh ở đây

Và sau đó bấm vào thanh "lệnh". nhập mô tả hình ảnh ở đây

Kiểm tra "Chạy lệnh tùy chỉnh thay vì bán của tôi" và viết bất kỳ lệnh nào bạn muốn thực hiện khi khởi động thiết bị đầu cuối của mình.


1

Không có câu trả lời nào ở trên hoạt động với tôi - exec tmuxngăn tôi đóng tmux mà không thoát khỏi trình bao (cho dù nó được mở bằng Ctrl+ Thoặc từ menu ứng dụng).

Tôi sử dụng Linux Mint, cho phép bạn ánh xạ một số phím nóng nhất định tới các lệnh và (không phải như vậy đối với một số ..) Tôi đã có các bash shell với các lệnh bắt đầu từ đó, ví dụ Win+ Alt+ Bthực hiện một số bash -exec(vim)câu lệnh phức tạp chỉnh sửa .bashrc của tôi, để nó hoạt động như một trình bao thông thường.

tmux được tải chứ không phải vim trong tình huống đó sau khi đặt phần trên ở trên cùng của tôi .bashrc. Tôi đã gói dòng thực thi tmux trong một câu lệnh if khác, kiểm tra xem nó có chạy ở chế độ tương tác không.

if command -v tmux>/dev/null; then
        if [ ! -z "$PS1" ]; then # unless shell not loaded interactively, run tmux
                [[ ! $TERM =~ screen ]] && [ -z $TMUX ] && tmux
        fi
fi

Bạn có thể gói tất cả những thứ đó lên một dòng nhưng để dễ đọc tôi nghĩ điều đó tốt.


Thêm một dấu và sẽ giải quyết vấn đề đó như vậy. [[ ! $TERM =~ screen ]] && [ -z $TMUX ] && exec tmux &
Daniel Chateau

1

Thêm vào câu trả lời của @Louis Maddox, tôi sẽ thực hiện phần tmux với;

(exec tmux attach || exec tmux new-session)

Tôi sử dụng exec sh -c 'tmux a || tmux', điều này (sau khi nhìn vào câu trả lời của bạn) có thể sẽ khiến điều tồi tệ xảy ra nếu tmux không thể bắt đầu vì bất kỳ lý do nào ..... cảm ơn, tôi sẽ sử dụng của bạn từ bây giờ :)
Mark K Cowan

1
tmux new -A -s mysessioncó lẽ cũng sẽ làm việc
poolie

1

Đây là trong ~/.profile(tôi đang sử dụng ksh93):

if [[ -z "$TMUX" ]]; then
    if tmux has-session 2>/dev/null; then
        exec tmux attach
    else
        exec tmux
    fi
fi

Nếu TMUXbiến môi trường không được đặt / trống, thì chúng ta chưa tham gia phiên tmux, vì vậy ...

Nếu tmux has-sessiontrả về với trạng thái thoát không (đúng), có một phiên có sẵn để đính kèm. Đính kèm với nó.

Nếu không, tạo một phiên mới.

Cũng có thể sử dụng tmuxlàm vỏ đăng nhập của bạn. Tuy nhiên, nếu bạn làm điều này, hãy đảm bảo đặt default-shellthành một vỏ thực tế trong ~/.tmux.conftệp của bạn (xem hướng dẫn sử dụng tmux để biết thêm thông tin về điều này).


1

Bạn có thể (và như bây giờ có lẽ nên) sử dụng chshlệnh để đặt tmux làm shell mặc định, sau đó thêm phần sau vào .tmux.conf:

set-option -g default-shell /path/to/your/favourite/shell

Chỉ cần nhớ sửa đổi đường dẫn ở cuối dòng.


1

Tôi đã kết hợp các kiểm tra mở rộng, với kiểm tra phiên có điều kiện và đặt vòng quay của riêng tôi vào đó, để tạo một phiên mặc định được kết nối với hoặc được tạo khác. Trừ khi bạn ở trong một phiên tmux khác, hoặc các điều kiện bảo vệ khác được đáp ứng.

if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  tmux a -t default || exec tmux new -s default && exit;
fi

Dựa trên những câu trả lời sau:

https://unix.stackexchange.com/a/306165/198110

https://unix.stackexchange.com/a/113768/198110


0

Thêm cái này vào ~/.tmux.conf

set -g default-command /usr/local/bin/fish

1
Tôi nghĩ rằng bạn đã hiểu nhầm người bạn đời! ;)
PhilT

-3

Như Mikel đã nêu trong bình luận của mình để có tmux vì vỏ đăng nhập của bạn có thể có tác dụng phụ. Nhưng bạn có thể làm cho tmuxvỏ mặc định của bạn, theo nghĩa đen. Trình bao mặc định của người dùng được xác định trong / etc / passwd. Vì vậy, bạn có thể trở thành root và chỉnh sửa / etc / passwd, ví dụ: sudo vi /etc/passwdtìm kiếm dòng bắt đầu bằng tên người dùng của bạn. Nó có thể kết thúc với :/bin/bash. Thay đổi / bin / bash thành / usr / bin / tmux và bây giờ tmux là vỏ đăng nhập mặc định của bạn.

Tuy nhiên, không có gì đảm bảo rằng điều này sẽ không gây ra vấn đề!

Những gì có thể làm việc tốt hơn là KHÔNG làm bất cứ điều gì đòi hỏi quyền lợi gốc. Tôi sẽ cố gắng tạo một tệp trong directoy nhà của tôi có tên .bash_login và bắt đầu tmux từ trong tệp đó: `echo" tmux "> ~ / .bash_login.

Điều này sẽ hoạt động, nhưng bạn phải thử và tự tìm kiếm, b / c tài liệu bash không chính xác về tập tin được đọc và thực thi khi nào.


2
Những gì đoạn đầu tiên của bạn mô tả là những gì chshlàm! Ngoại trừ cách của bạn yêu cầu phải root và dễ bị lỗi. Chạy tmuxtừ .bash_loginnhiều khả năng phá vỡ đăng nhập từ xa.
Gilles
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.