Tôi muốn shell bash mặc định của tôi đi thẳng vào tmux thay vì tôi luôn phải gõ tmux mỗi lần.
Tôi muốn shell bash mặc định của tôi đi thẳng vào tmux thay vì tôi luôn phải gõ tmux mỗi lần.
Câu trả lời:
Đ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
TERM
có thể được đặt thành một số giá trị khác bởi .tmux.conf
tệp của người dùng . Tốt hơn để kiểm tra xem TMUX
biến được đặt hay không.
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
command
để kiểm tra sự tồn tại của lệnh - http://man7.org/linux/man-pages/man1/bash.1.html#SHELL_BUILTIN_COMMANDScommand
thay vì which
kiểm tra sự tồn tại của các lệnh - https://unix.stackexchange.com/a/85250$PS1
để kiểm tra vỏ tương tác - https://www.gnu.org/software/bash/manual/html_node/Is-this-Shell-Interactive_003f.html$TERM
biến môi trường dự kiến "cho tất cả các chương trình chạy bên trong tmux" - http://man7.org/linux/man-pages/man1/tmux.1.html#WINDOWS_AND_PANEScommand
trước đây nhưng không nhận ra nó tồn tại.
exec
tuyê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! : |
exec
thay 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 :)
exec tmux
bằng hương vị ưa thích của bạntmux attach
exec tmux
tôi sử dụng exec tmux new-session -A -s main
vì 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 attach
trong trường hợp không có phiên nào (tìm thấy ở đây: unix.stackexchange.com/a/176885/256942 )
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 exit
phần:
[ -z "$TMUX" ] && { tmux attach || exec tmux new-session;}
Cũng lưu ý bạn không nên quấn tmux attach
vớ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.
Có lệnh chsh
thay đổi vỏ đăng nhập. Tham khảo ý kiến man chsh
.
tmux
khô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ợ -c
tù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 .
ssh $some_server echo foo
).
/etc/shells
, vì vậy đây là một vỏ đăng nhập hợp lệ.
default-shell
cài đặt trong cấu hình tmux để trỏ đến trình bao thực tế.
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, .bashrc
thay vào đó hãy đặt nó vào .
Tôi cũng vừa thử cài đặt tmux
là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 foo
sẽ không tạo ra bất kỳ đầu ra nào.
Không có câu trả lời nào ở trên hoạt động với tôi - exec tmux
ngăn tôi đóng tmux mà không thoát khỏi trình bao (cho dù nó được mở bằng Ctrl
+ T
hoặ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
+ B
thự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.
[[ ! $TERM =~ screen ]] && [ -z $TMUX ] && exec tmux &
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)
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ờ :)
tmux new -A -s mysession
có lẽ cũng sẽ làm việc
Đâ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 TMUX
biế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-session
trả 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 tmux
là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-shell
thành một vỏ thực tế trong ~/.tmux.conf
tệ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).
Bạn có thể (và như bây giờ có lẽ nên) sử dụng chsh
lệ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.
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:
Thêm cái này vào ~/.tmux.conf
set -g default-command /usr/local/bin/fish
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 tmux
vỏ 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/passwd
tì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.
chsh
làm! Ngoại trừ cách của bạn yêu cầu phải root và dễ bị lỗi. Chạy tmux
từ .bash_login
có nhiều khả năng phá vỡ đăng nhập từ xa.
[[ $- != *i* ]] && return
không phải là một vòng lặp vô hạn (từ cùng một trang)